問題の命令です
find . -name "*.txt" | xargs -Ifile sh -c 'echo $(basename $1) ' -- file
したがって、二重ダッシュがないと転送されずfile
にsh
そのまま認識されます$1
。なぜそんなことですか?これにより、--
後続のパラメータがコマンドラインオプションとして認識されないことがわかります。しかし、file
前にダッシュがないため、コマンドラインオプションとして認識する理由はないようです。
答え1
オプションではない最初のパラメータはにsh
なります$0
。sh
スクリプトから呼び出されると、これはスクリプトへのパスです。を実行すると、sh -c SOMECOMMAND
シェルはパラメータを入れる以外にパラメータに対して何もしません$0
。通常、-c
where is the name or path of the script と同様に に渡されたスクリプトの名前ですsh /path/to/script
。$0
ほとんどのコマンドとは異なり、--
特殊目的フラグではなく汎用パラメーターとして扱われます。したがって--
、実際には$0
次のパラメータの代わりに使用されます。
$ sh -c 'echo $1' hello
$ sh -c 'echo $0' hello
hello
$ sh -c 'echo $0; echo $1' hello world
hello
world
$ sh -c 'echo $0; echo $1' -- hello
--
hello
xargs
これは、すべての引数をコマンドsh
に渡すこととは関係ありません。sh
答え2
上記の例では、と間のブレーカーとして--
機能します。文字列を引数に強制します。sh -c 'echo $(basename $1) '
file
file
$1
sh
上記は以下のように単純化できます。
$ find . -name "*.txt" | xargs -Ifile sh -c 'echo $(basename file) '