Comportamento errado de xargs

1

Eu estava tentando resolver este problema usando find + xargs , mas fiquei com outro problema

Eu estou tentando aumentar a count usando ((a++)) , mas não está funcionando. Eu tentei um par de combinação de contar um valor, por exemplo. let a++ a=$[ $a + 1] e assim por diante.

Veja abaixo a saída

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

EDIT: - xargs fez tudo no mesmo shell

por exemplo. com 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
    
por Rahul Patil 04.04.2013 / 05:54

1 resposta

1

O problema é que suas variáveis estão sendo expandidas pelo bash antes que o find seja executado. Por causa disso $a é expandido para 0, $$ é expandido para o PID do seu shell (login), então o comando que é executado por bash -xc é, na verdade:

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

Aqui {} é substituído por xargs com o resultado de find e o valor de $a é pós-incrementado, mas nunca é impresso. Tente escapar as variáveis (como em \$a ), ou melhor ainda, colocando os argumentos bash -xc entre aspas simples ( ' ) em vez de aspas duplas ( " ) para ver se funciona.

Você também notará que os outros comentadores estão corretos, xargs -n1 (ou com -I{} ) executa um novo shell para cada argumento, portanto, incrementar $a não funcionará - o valor incrementado não será visível para o próxima invocação do comando bash -xc .

    
por 05.04.2013 / 11:52

Tags