bash傳遞命令結果到陣列的不同方式有差 - Linux

Ethan avatar
By Ethan
at 2018-02-25T02:21

Table of Contents

※ 引述《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新舊版的執行結果為何也不同。
: 請問有人知道兩種寫法的差別和原理嗎?


--
Tags: Linux

All Comments

Ursula avatar
By Ursula
at 2018-02-27T06:27
為什麼不是 ls -lrt /tmp/ | mapfile -t -s 1 lines ?
Aaliyah avatar
By Aaliyah
at 2018-03-01T10:43
了,難怪我找不到 mapfile 這個命令
Joe avatar
By Joe
at 2018-03-02T05:19
目前都用 readarray 命令取代了 印象中
Joseph avatar
By Joseph
at 2018-03-02T22:43

請問有在 Linux 觀看、破解 DRM 影片的方法嗎?

Kama avatar
By Kama
at 2018-02-24T15:03
最近找了一部影片來看,他的預告片和演員真的很吸引我, 但卻發現因為他是有 DRM 保護的影片,所以沒辦法看, 使用 mpv 一直出現 ffmpeg 不支援的提示,如下: [ffmpeg/video] wmv3: Old interlaced mode is not supported 有試過在 Windo ...

開機後Login前讓程式自動執行

Iris avatar
By Iris
at 2018-02-24T14:00
大家好: 我最近剛開始學習使用ubuntu,我現在用vim寫了一個.cpp的程式,現在都是 用g++ server.cpp -o server編譯出server,再用./server執行程式。 現在我希望讓server在開機後就自動執行,在網路上查的結果是要寫一個.sh 放 ...

bash傳遞命令結果到陣列的不同方式有差

Hardy avatar
By Hardy
at 2018-02-24T12:44
我需要在bash裡面把上萬筆的資料丟到array中,我用過兩種方式 mapfile -t -s 1 linesandlt;andlt;andlt;$(ls -lrt /tmp/) echo ${lines[at]} 新版的clonezilla這個命令是有效的。2.4.5-23版或centos則是空的。 m ...

Linux Samba 檔案占用磁區

Hedda avatar
By Hedda
at 2018-02-24T12:27
不知道在這裡發文適不適當 ~ 最近想寫一些檔案系統管理的程式,所以在家裡架了一個Linux Samba(NAS) 。 我在Linux平台上mount該Samba,並用 du 去查詢檔案或資料夾占用的磁區大小。 然後 ... 讓我無法理解的事情就這樣發生了 我發現實際上只有49.2KB的檔案竟然佔據了4GB ...

素梅派安裝OPENCV問題

Bethany avatar
By Bethany
at 2018-02-23T17:13
如標題:我從網路上按照步驟操作但是一直跳出下列的錯誤 鑒於本身是程式新手上網搜尋方法都似懂非懂想請教版上高手 [ 12%] Linking CXX static library ../../lib/libopencv_core_pch_dephelp.a [ 12%] Built target openc ...