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확장되는 0으로 확장되므로 실제로 실행되는 명령은 다음과 같습니다.$$bash -xc

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

이는 {}의 결과로 xargs로 대체되며 find값은 $a사후 증가되지만 인쇄되지는 않습니다. 변수를 이스케이프 처리(예 \$a: )하거나 더 나은 방법은 bash -xc매개변수를 큰따옴표( ') 대신 작은따옴표( ")로 묶어서 작동하는지 확인하는 것입니다.

또한 다른 주석 작성자가 정확하거나 xargs -n1(또는 ​​을 사용하여 -I{}) 각 인수에 대해 새 쉘을 실행하므로 증분은 $a작동하지 않습니다. bash -xc다음 명령 호출에서는 증분된 값이 표시되지 않습니다.

관련 정보