Re: [问题] bash传递命令结果到阵列的不同方式有差

楼主: kenduest (小州)   2018-02-25 02:21:30
※ 引述《LIAR (玻璃做的大叔)》之铭言:
: 我需要在bash里面把上万笔的资料丢到array中,我用过两种方式
: mapfile -t -s 1 lines<<<$(ls -lrt /tmp/)
: echo ${lines[@]}
改成这样就好啊:
mapfile -t -s 1 lines <<< "$(ls -lrt /tmp/)"
用双引号包起来。
因为 ls -ltr /tmp 是很多行输出结果,要考虑实际后续资料传入给
mapfile 命令时候情况。
简单这样说好了:
result=$(cat /etc/passwd)
后续你用 echo $result 与 echo "$result" 结果不一样的,
前者换行字符带入显示就变成 space 空白字符了。你可以用:
echo "$result" | hexdump -C | head
echo $result" | hexdump -C | head
自己看一下差别。
那原本你使用的命令为何结果是空的?依据 mapfile 参数说明:
mapfile:
-s count Discard the first COUNT lines read.
-t Remove a trailing newline from each line read.
你用了-s 1 把第一行吃掉忽略,而刚好结果是一整行内容,所以结果就是空的。
你把 -s 1 拿掉可以拿到结果,但是 mapfile 没有读取实际换行字符,但是资料
没有多行所以最后产生 array 也是破功...
: 新版的clonezilla这个命令是有效的。2.4.5-23版或centos则是空的。
: mapfile -t -s 1 lines< <(ls -lrt /tmp/)
: echo ${lines[@]}
: 这样有东西。
这又是其他的语法了。实际上运作就是:
1. 执行 ls -lrt /tmp 输出结果,应对到 /dev/fd/<xxx> 这种 named FIFO 档案
2. 执行 mapfile -t -s 1 lines < /dev/fd/<xxx>
所以运作正常没特别地方,因为等于类似:
1. ls -lrt /tmp > myfile.txt
2. mapfile -t -s 1 lines < myfile.txt
只是 myfile.txt 需要自己删除。
: 那个<<<中间两个或三个没有,和$的有无是搭配的,不能混用,不然会错。
: 我看鸟哥的教学,我只用过 $(command) 这种方式。但反而这个写法无法得到array。
: 虽然有爬文找redirection和Here Strings的解释,但我还是搞不懂两种写法的差别,
: 而且也搞不懂clonezilla新旧版的执行结果为何也不同。
: 请问有人知道两种写法的差别和原理吗?
作者: hijkxyzuw (i,j,k) ×(x,y,z)   2018-02-25 11:33:00
为什么不是 ls -lrt /tmp/ | mapfile -t -s 1 lines ?了,难怪我找不到 mapfile 这个命令
楼主: kenduest (小州)   2018-02-25 18:40:00
目前都用 readarray 命令取代了 印象中
作者: Hevak (Arthow Eshes)   2018-02-26 00:44:00

Links booklink

Contact Us: admin [ a t ] ucptt.com