2012-04-16 11 views
0

上にないLinux上で動作しますFedoraの上ではなく、OS Xのライオン上で動作し、実際に何か有用なものから蒸留簡単なスクリプト、です。bashスクリプトは、ここでのMac OS X

declare -a directory_contents=($(ls .)) 
test -e ${directory_contents[0]} 
echo $? 

Linuxの場合、test -eは0を返します。 Macでは、それは間違ってここに行くことができるもの1.

任意のアイデアを返しますか?

+0

上記のコードは私のOS X 10.6.8 ... – miku

+0

@NickAtoms、0を返す[はい](https://gist.github.com/2401956)。それは良い古いbash 3.2.48(1) - リリースです。 – miku

+0

Appleはまだbash 4.xではなくbash 3.2を配布しています。それはあなたのトラブルの原因ですか? –

答えて

0

は私の「スクリプトは」本当に、bashの関数であることです。私の問題の原因は "ls"が "--color = auto"でエイリアスに解決され、実際のファイル名に印字不能文字が追加されたためです。

必ず例えば、「LS =/binに/ LS」、スクリプトで使用される実行可能ファイルのフルパスを保持する変数を定義します。上記の回答ごとに、lsは堅牢なプロダクションスクリプトのための最良の選択ではないかもしれません。

4

lsによって返される最初のファイルに名前にスペースが含まれている場合、${directory_contents[0]}はフルファイル名(最初のスペースまで)には展開されません。この条件はFedoraテストではなくOSXテストに適用されますか?問題を解決するかもしれない宣言文の前に以下の行を追加し

IFS=$'\n' 

参照:http://www.linuxquestions.org/questions/programming-9/bash-passing-arrays-with-spaces-611159/

2

ニックの答えは正しいです。しかし、高度に制御された環境を除いて、lsではなく、であることを忘れないでください。変数にファイル名を設定する必要があります。 1つのファイル名を選択するには他にもいくつかの方法があります。

[[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] ~]$ 

明らかではなく、すべてのメソッドは同じ順序でファイルを返します。

はまた、ハイフンで始まるファイル名に留意します。 :-)私は私の元の質問に明確にすることを怠っ何

+0

Upvoteあなたの答えが問題の中心になる、つまり "ls"に頼らないでください。それは実際の原因ではありませんが。私は自分の質問に答えていますが、明らかになっているようですが、うまくいけば他の人を助けてくれます。 – pduey