![xargs 的错误行为](https://linux22.com/image/30637/xargs%20%E7%9A%84%E9%94%99%E8%AF%AF%E8%A1%8C%E4%B8%BA.png)
我试图解决这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
命令的下一次调用将不可见。