これは、fedora では動作するが OS X Lion では動作しない、実際に役立つものから抜粋した単純なスクリプトです。
declare -a directory_contents=($(ls .))
test -e ${directory_contents[0]}
echo $?
Linux では 0 を返します。つまり、test -e はパスします。Mac では 1 を返します。
ここで何がうまくいかないのでしょうか?
これは、fedora では動作するが OS X Lion では動作しない、実際に役立つものから抜粋した単純なスクリプトです。
declare -a directory_contents=($(ls .))
test -e ${directory_contents[0]}
echo $?
Linux では 0 を返します。つまり、test -e はパスします。Mac では 1 を返します。
ここで何がうまくいかないのでしょうか?
によって返される最初のファイルls
の名前にスペースが含まれている場合${directory_contents[0]}
、完全なファイル名には展開されません (最初のスペースまでのみ)。この条件は Fedora テストではなく、OSX テストに適用されますか?
宣言ステートメントの前に次の行を追加すると、問題が解決する場合があります。
IFS=$'\n'
参照: http://www.linuxquestions.org/questions/programming-9/bash-passing-arrays-with-spaces-611159/
ニックの答えは正しいです。ただし、高度に制御された環境を除いて、変数にファイル名を入力するために使用する必要があるものでls
はないことも覚えておく必要があります。単一のファイル名を選択する方法は他にもたくさんあります。
[ghoti@pc ~]$ 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
[ghoti@pc ~]$ test1=`for i in foo*txt;do echo $i; break; done`
[ghoti@pc ~]$ echo $test1
foo bar.txt
[ghoti@pc ~]$ test2=`find . -name foo\*.txt -print | head -1`
[ghoti@pc ~]$ echo $test2
./foo.txt
[ghoti@pc ~]$
もちろん、すべてのメソッドが同じ順序でファイルを返すわけではありません。
ハイフンで始まるファイル名にも注意してください。:-)
元の質問で明確にし忘れていたのは、私の「スクリプト」が実際には bash 関数であるということです。私の問題の原因は、「ls」が「--color=auto」のエイリアスに解決され、実際のファイル名に印刷できない文字が追加されることです。
スクリプトで使用される実行可能ファイルへのフル パスを保持する変数を常に定義します (例: "LS=/bin/ls")。また、上記の回答によると、堅牢な本番スクリプトには ls が最適ではない可能性があります。