ワイルドカードを使用してファイル名を渡すときに、Bash関数がスペースを含むファイル名を正しく処理するにはどうすればよいですか?
$ touch a "a b" b
$ ls -1 *
a
a b
b
$ function foo { ls -1 $*; }
$ foo *
a
a
b
c
ls -1 *
実行したときと同じ結果を返すfoo関数を定義したいと思いますfoo *
。$@
代わりに試してみましたが、やはり$*
効果がありませんでした。
ベストアンサー1
関数の呼び出し方法を考えると、関数が何をすべきかわかりません。しかし、これは可能な解決策です。
foo () { ls -1 "$@"; }
関数は、ls -1
コマンドに渡された関数位置引数を使用して呼び出す必要があります。どのように動作しますか?
$ touch a "a b" b
$ ls -1 .
a
a b
b
$ foo .
a
a b
b
これはまた働きます:
$ foo *
a
a b
b
foo .
しかし、その違いを知る必要がありますfoo *
。前者は.
関数に引数として渡され、次にfoo
同じ引数が内部的に渡されますls -1
。関数で拡張された引数のリストを内部的に処理する必要があるfoo *
ため、状況は異なります。これは、スペースを処理するために位置パラメータを拡張する私の関数で行われます。周辺参照を省略すると、次のようになります。*
foo
"$@"
$@
$ goo () { ls -1 $@; }
$ goo .
a
a b
b
$ goo *
a
a
b
b
"$*"
最後に、「$ @」で違いを分析できます。
$ hoo () { ls -1 "$*"; }
$ hoo .
a
a b
b
$ hoo *
ls: cannot access 'a a b b': No such file or directory
ここで「$*」は間違いなく正しくありません。
$ foo . .
.:
a
a b
b
.:
a
a b
b
$ hoo . .
ls: cannot access '. .': No such file or directory