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 在同一个 shell 中完成了所有操作

例如。带 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 扩展。因为这个$a被扩展为0,$$被扩展为你的(登录)shell的PID,所以执行的命令bash -xc实际上是:

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

这里{}被 xargs 替换为来自的结果find,并且 的值$a是后递增的,但从未打印。尝试转义变量(如\$a),或者更好的是,将bash -xc参数放在单引号 ( ') 而不是双引号 ( ") 中以查看其是否有效。

您还会注意到其他评论者是正确的,xargs -n1(或 with -I{})为每个参数执行一个新的 shell,因此递增$a将不起作用 - 递增的值对于bash -xc命令的下一次调用将不可见。

相关内容