我寫的下一個測試shell腳本:
#!/bin/sh
IFS=$'\n'
for d in `find . -name *.cue -print0 | xargs -0 -n1 dirname | sort --unique`
do
unset IFS
echo "$d"
IFS=$'\n'
done
unset IFS
如果我在執行我獲得這樣的事情在bash的條件find命令:
./[FLAC] Destination Goa - The Sixth Chapter (CD)/CD2
./[FLAC] Eat Static - Implant - (CD)
./[FLAC] Elysium - Dance For The Celestial Beings (CD)
./[FLAC] Elysium - Monzoon 1996 (CD)
./[FLAC] Etnica - The Juggeling Alchemists Under The Black Light
在shell腳本(含線索文件的文件夾的名稱),我想用這個文件夾中的每一個循環,但是,當然,如果我不重新定義IFS的occurreances打破空間:
Experience
4
./[FLAC]
VA
-
Trancentral
Five
A
Sonic
Initiation
./[FLAC]
VA
-
Trancentral
在其他計算機(MacOS的)我解決了這個問題改變了IFS到特徵線與此命令IFS=$'\n'
但在我家的電腦(一個Ubuntu Linux)的環打破事件爲「N」:
tra
ce - A Trip To Psychedelic Tra
ce (CD)/CD1
./[FLAC] VA - Ta
tra
ce - A Trip To Psychedelic Tra
ce (CD)/CD2
./[FLAC] VA - Tech
o Tra
ce Ma
你知道發生了什麼,爲什麼計算機之間的不同行爲? 謝謝。
什麼'/ bin/sh的--version'(或'/ bin/sh的,如果那並不是-v'混合不工作)在兩臺機器上打印? – l0b0
這不是正確的方式來遍歷線路總之。如果您的名稱中有一個帶有「*」或其他通配符的文件,它將被shell擴展爲任何匹配的名稱。 @ l0b0給出的while循環方法更安全。 –
...即使如此,你也不能使用換行符安全地劃分文件名,因爲文件名*可以包含*換行符。如果你有一個名爲'./$'的文件,那麼怎麼辦?\ n'/ etc/passwd $'\ n'/ foo.cue'?用NUL字節分隔文件名是唯一安全的方法。 –