3つのファイルがあるディレクトリfile1
とfile2
次のbashスクリプトがあります。
#!/bin/bash
set -e
Command="ls -1 -I file1"
echo "Command: $Command"
Files=`$Command`
echo "Files:"
echo $Files
結果は予想した通りだった。つまり、file1
無視され、リストには表示されません。
$ ./test.sh
Command: ls -1 -I file1
Files:
file2
test.sh
名前にスペースが含まれているファイルを無視するようにサポートするにはどうすればよいですか?ファイル名を引用符で囲む必要がありますか?素晴らしい...
#!/bin/bash
set -e
Command="ls -1 -I 'file1'"
echo "Command: $Command"
Files=`$Command`
echo "Files:"
echo $Files
生産する:
$ ./test.sh
Command: ls -1 -I 'file1'
Files:
file1
file2
test.sh
ただし、Bashで同じコマンドを直接評価すると、正しい結果が得られます。
$ ls -1 -I 'file1'
file2
test.sh
ここで何が起こっているのでしょうか?引用符を追加すると、何かを脱線するようですが、なぜですか?
コマンドを次のように変更すると役に立ちません。
Command="ls -1 -I \"file1\""
Command="ls -1 --ignore='file1'"
コマンドの評価を変更しても役に立ちません。
Files=$($Command)
Files=$(`echo $Command`)
正しい動作は導入によってのみ達成できるようです。eval
Files=$(eval $Command)
Files=`eval $Command`
なぜそれが評価され実行されるのか理解したいのですが、引用されls
たパラメータは追加されない限り無視されます。eval
ベストアンサー1
なぜなら見積もりの削除引用符自体が引用符で囲まれている場合、引用符には適用されません。
存在する:
Command="ls -1 -I 'file1'"
一重引用符'
は二重引用符で囲まれているため、"
文字列の一部と見なされます。printf
with %q
(in bash
、ksh
and zsh
)を使用して次のことを確認できます。
$ printf '%q\n' "$Command"
ls -1 -I 'file1'
端末で直接実行すると、単一引用符は引用符ではなくシェルから削除されます。