xargsの無効な動作

xargsの無効な動作

私は解決しようとしました。これfind+の使用中に問題が発生しましたが、xargs別の問題が発生しました。

試してみましたが、aカウントを増やすことを試みませんでした。((a++))私は計算された値のいくつかの組み合わせを試しました。let a++ a=$[ $a + 1]など..

以下の出力を参照してください。

rax@ubuntu:~# find ./test/ -mindepth 1 | xargs -I{} -n1 bash -xc "((a++)) ; echo $a {}"
+ (( a++ ))
+ echo 0 ./test/abc1
0 ./test/abc1
+ (( a++ ))
+ echo 0 ./test/abc1/abc
0 ./test/abc1/abc
+ (( a++ ))
+ echo 0 ./test/abc2
0 ./test/abc2
+ (( a++ ))
+ echo 0 ./test/abc3
0 ./test/abc3
+ (( a++ ))
+ echo 0 ./test/abcparent
0 ./test/abcparent

編集: - xargsはすべて同じシェルで行われました。

例えば。 PIDとともに

rax@ubuntu:~# a=0
rax@ubuntu:~# find ./test/ -mindepth 1 | xargs -L2 -I{}  bash -xc "echo $a {} ;((a++)) ; echo $a $$"
+ echo 0 ./test/abc1
0 ./test/abc1
+ (( a++ ))
+ echo 0 1314
0 1314
+ echo 0 ./test/abc1/abc
0 ./test/abc1/abc
+ (( a++ ))
+ echo 0 1314
0 1314
+ echo 0 ./test/abc2
0 ./test/abc2
+ (( a++ ))
+ echo 0 1314
0 1314
+ echo 0 ./test/abc3
0 ./test/abc3
+ (( a++ ))
+ echo 0 1314
0 1314
+ echo 0 ./test/abcparent
0 ./test/abcparent
+ (( a++ ))
+ echo 0 1314
0 1314

答え1

問題は、findを実行する前に変数がbashによって拡張されることです。これは(ログイン)シェルのPIDに$a拡張されるゼロに拡張されるため、実際に実行されるコマンドは次のようになります。$$bash -xc

echo 0 {} ;((a++)) ; echo 0 1314

これ{}は結果としてxargsに置き換えられ、find値は$a後で増加しますが印刷されません。変数をエスケープする(たとえば\$a)、またはより良い方法は、パラメータbash -xcを二重引用符(')ではなく一重引用符(")で囲んで機能することを確認することです。

また、他のコメント作成者が正しいかxargs -n1(またはを使用して-I{})、各引数に対して新しいシェルを実行するため、増分は$a機能しません。bash -xc次のコマンド呼び出しでは、増分値は表示されません。

関連情報