在bash,如果你這樣做:有一種簡單的方法來設置對了nullglob一個水珠
mkdir /tmp/empty
array=(/tmp/empty/*)
你發現array
現在有一個元素,"/tmp/empty/*"
,不爲零,只要你願意。值得慶幸的是,這可以通過打開使用了nullglob外殼選項可以避免shopt -s nullglob
不過了nullglob是全球性的,編輯現有的shell腳本時,可能會打破東西(例如,沒有人檢查ls foo*
退出代碼來檢查是否有是以「foo」開頭的文件嗎?)。所以,理想情況下,我只想將它打開一個小範圍 - 理想情況下,一個文件名擴展。你可以關閉它再次使用shopt -u nullglob
不過,當然,只有當它被禁用前:
old_nullglob=$(shopt -p | grep 'nullglob$')
shopt -s nullglob
array=(/tmp/empty/*)
eval "$old_nullglob"
unset -v old_nullglob
讓我覺得必須有一個更好的辦法。顯而易見的「將它放在子外殼中」並不適用,因爲變量賦值與子外殼一起死亡。除了導入ksh93語法的waiting for the Austin group,有嗎?
這很不錯。如果文件名中有換行符,它會失敗,但儘管允許,但這種情況非常罕見。只要文件名不受攻擊者控制。 – derobert 2013-12-14 15:09:52
是的,文件名中的換行符確實存在。通常情況下,這隻意味着「找到罪魁禍首並懲罰他/她」。除了我唯一一次看到文件名中的換行符,罪魁禍首是一位迷人的老太太...... – mivk 2013-12-23 19:29:11