Ampersand após loop em scripts de shell

1

Qual é a diferença entre executar os seguintes comandos no terminal?

command1

for i in {1..3}; do ./script.sh >& log.$i  & done

e

command2

for i in {1..3}; do ./script.sh >& log.$i  & done &

A execução do primeiro comando mostra três identificações de trabalho na tela e eu posso digitar o próximo comando no terminal.

O segundo comando é um pouco estranho, ele não mostra nenhum ID de trabalho na tela nem posso vê-lo após executar o comando jobs . Para onde foram os trabalhos?

Dentro do script.sh tenho o seguinte loop

for k in 1; do
 ./tmp -arguments
done

echo "hello"

Se eu usar o comando 1, posso ver via htop que ./tmp executável está em execução e echo "hello" ainda não foi executado (não no arquivo de log).

Se eu usar o comando 2, posso ver via htop que ./tmp executável está em execução E echo "hello" já foi executado (como visto no arquivo de log).

Por que um & no terminal mudaria o comportamento do loop for dentro do script de shell?

[GNU bash, versão 4.3.11 (1) -release (x86_64-pc-linux-gnu)]

    
por user13107 01.09.2016 / 06:08

2 respostas

2

O primeiro

for i in {1..3}; do
    ./script.sh >& log.$i  &
done

é executado no shell atual. Cada iteração do loop executa o script script.sh como um trabalho do shell atual e, portanto, você pode vê-lo.

O segundo

for i in {1..3}; do
    ./script.sh >& log.$i  &
done &

primeiro inicia um subshell que controla o loop. Em seguida, as 3 iterações criam 3 subprocessos no shell this , enquanto no seu shell atual você só pode ver 1 job, que é o comando inteiro, ainda não dividido em tarefas específicas. (Você deve ver este trabalho 1. Seja como um executando ou como concluído .)

O executável ./tmp deve ser executado da mesma maneira em ambos os casos. Se você ver echo "hello" foi executado, isso significa que ./tmp foi concluída antes. Se ele se comportar de forma anormal, você deve depurar (e adicionar os detalhes à sua pergunta). Especialmente, verifique se as condições iniciais são as mesmas no momento da chamada em ambos os casos. Por exemplo. se houver verificações de arquivos existentes, verifique se, em ambos os casos, eles existem / não existem, etc.

    
por 01.09.2016 / 19:58
-1

Oe comercial no final está fazendo com que o comando seja executado em segundo plano. Para uma explicação completa, confira este link.

Executando o comando Bash em segundo plano

    
por 01.09.2016 / 18:58