Variáveis ENV em relação a loops xargs

4

As variáveis de env (definidas usando export ) são tratadas de maneira diferente quando o mesmo script é executado várias vezes simultaneamente? Essa é uma pergunta estranha, então aqui está um exemplo que eu criei, que é semelhante ao meu problema real.

hello.sh

#!/bin/bash
export COUNTER=$((COUNTER+1));
echo $COUNTER;
sleep 5;
/hello.sh

nums.txt

1
2
3
4
5

bash

# cat /nums.txt | xargs -L 1 -P 5 /hello.sh

saída esperada

1
2
3
4
5
   (...5 seconds later)
6
7
8
9
10

saída real

1
1
1
1
1
   (... 5 seconds later)
2
2
2
2
2

Portanto, executá-lo apenas uma vez funciona bem. Mas quando eu começo a rodar várias vezes em paralelo é quando eu testemunho esse comportamento. Eu suponho que seja por um motivo, mas não tenho ideia de como evitá-lo.

Para adicionar plano de fundo, meu objetivo aqui é que, quando cada script for concluído, ele volte a ser iniciado com o próximo incremento lido de $ COUNTER. Dessa forma, posso configurá-lo uma vez começando com 5 segmentos separados, e cada um deles incrementará continuamente e chamará o script.

    
por d-_-b 29.12.2013 / 06:25

1 resposta

4

Sim, você está certo, isso é semelhante a " Como posso fazer variáveis de ambiente" exportadas "em um script de shell ficar por aqui? ".

Se você definir uma variável como:

COUNTER=$((COUNTER+1))

então ele existe apenas no shell atual. Ele não será visto por subshells que este shell cria ou pelo shell de chamada. Ao usar a exportação:

export COUNTER=$((COUNTER+1))

então a variável também é vista pelos subshells deste shell.

Quando você cria 5 processos com xargs, cada um herda o ambiente do shell de chamada. No entanto, eles não compartilham quaisquer alterações no ambiente entre si.

    
por 29.12.2013 / 06:43