這是一個簡單的腳本,從實際有用的東西中提煉出來的,適用於Fedora,但不適用於OS X Lion。bash腳本與Linux上的陣列作品不在mac os x
declare -a directory_contents=($(ls .))
test -e ${directory_contents[0]}
echo $?
在linux上它返回0,即測試-e通過。在Mac上,它返回1.
任何想法在這裏可能會出錯?
這是一個簡單的腳本,從實際有用的東西中提煉出來的,適用於Fedora,但不適用於OS X Lion。bash腳本與Linux上的陣列作品不在mac os x
declare -a directory_contents=($(ls .))
test -e ${directory_contents[0]}
echo $?
在linux上它返回0,即測試-e通過。在Mac上,它返回1.
任何想法在這裏可能會出錯?
我在原始問題中忽略的一點是,我的「腳本」確實是一個bash函數。我的問題的原因是「ls」正在解析爲具有「--color = auto」的別名,將不可打印的字符添加到實際的文件名。
總是定義變量來保存腳本中使用的可執行文件的完整路徑,例如「LS =/bin/ls」。而且,根據上面的答案,ls可能不是您強健的製作腳本的最佳選擇。
如果ls
返回的第一個文件名稱中有空格,${directory_contents[0]}
將不會展開爲完整的文件名(僅限於第一個空格)。這個條件是否適用於你的OSX測試,而不是你的Fedora測試?
添加聲明語句前加上下面一行可能會解決問題:
IFS=$'\n'
參考:http://www.linuxquestions.org/questions/programming-9/bash-passing-arrays-with-spaces-611159/
尼克的答案是正確的。但是你也應該記住,除非在高度控制的環境中,ls
是而不是你應該用來填充帶有文件名的變量。有很多其他的方法可以選擇一個文件名。
[[email protected] ~]$ ls -l foo*
-rw-r--r-- 1 ghoti wheel 0 Apr 16 21:01 foo bar.txt
-rw-r--r-- 1 ghoti wheel 0 Apr 16 21:01 foo.txt
[[email protected] ~]$ test1=`for i in foo*txt;do echo $i; break; done`
[[email protected] ~]$ echo $test1
foo bar.txt
[[email protected] ~]$ test2=`find . -name foo\*.txt -print | head -1`
[[email protected] ~]$ echo $test2
./foo.txt
[[email protected] ~]$
顯然,並不是所有的方法都會以相同的順序返回文件。
還要注意以連字符開頭的文件名。 :-)
Upvote,因爲你的答案直指問題的核心,即不要依賴「ls」。雖然這不是真正的原因。我回答了我自己的問題,儘管現在看起來很明顯,所以希望可以幫助其他人。 – pduey 2012-04-17 14:52:27
上面的代碼在我的OS X 10.6.8上返回0 ... – miku 2012-04-16 21:45:56
@NickAtoms,[yes](https://gist.github.com/2401956)。這是很好的老bash 3.2.48(1) - 釋放。 – miku 2012-04-16 22:00:43
蘋果仍然分發bash 3.2,而不是bash 4.x.這是你麻煩的根源嗎? – 2012-04-16 22:01:57