zsh espera que os trabalhos sejam concluídos

5

Quando eu digito o seguinte no meu terminal executando zsh (cada linha é um comando)

babel www/scripts6/lib/data.js > www/scripts/lib/data.js &
babel www/scripts6/lib/user.js > www/scripts/lib/user.js &
babel www/scripts6/lib/profile.js > www/scripts/lib/profile.js &
babel www/scripts6/lib/d3-and-svg.js > www/scripts/lib/d3-and-svg.js &
babel www/scripts6/main.js > www/scripts/main.js &
while [[ $(jobs) =~ 'babel' ]]; do echo 'moo'; done

Moos por cerca de 3 segundos e depois pára. Mas quando eu coloco o mesmo código exato no arquivo moo.zsh e depois o executo no meu terminal com

zsh moo.zsh

termina em menos de 1 segundo e não mexe de jeito nenhum. Por que isso aconteceu?

    
por mareoraft 04.09.2015 / 02:20

1 resposta

8

No shell não interativo, você não tem controle total de tarefas. Quando você inicia jobs na substituição do comando, ele é executado em uma subchave. Nesta sub-linha, não há empregos em execução, você não tem nada.

No shell interativo, o MONITOR foi definido , deu a você controle de empregos completos. Nesse caso, zsh armazena todos os trabalhos em uma tabela quando você insere um subshell e usará essa tabela se não houver trabalhos em subshell.

Com zsh 4.3 e acima, você pode ativar o controle de tarefas em um shell não interativo colocando -m na linha shebang:

#!/usr/bin/zsh -m

ou usando setopt :

setopt monitor
: The rest of script goes here

Uma maneira melhor de verificar o estado do trabalho pode ser:

#!/usr/bin/zsh
zmodload zsh/parameter

babel www/scripts6/lib/data.js > www/scripts/lib/data.js &
babel www/scripts6/lib/user.js > www/scripts/lib/user.js &
babel www/scripts6/lib/profile.js > www/scripts/lib/profile.js &
babel www/scripts6/lib/d3-and-svg.js > www/scripts/lib/d3-and-svg.js &
babel www/scripts6/main.js > www/scripts/main.js &

while (( ${#jobstates} )); do
  print "moo"
done

De qualquer forma, você pode esperar por todos os processos filhos com aguardar :

babel www/scripts6/lib/data.js > www/scripts/lib/data.js &
babel www/scripts6/lib/user.js > www/scripts/lib/user.js &
babel www/scripts6/lib/profile.js > www/scripts/lib/profile.js &
babel www/scripts6/lib/d3-and-svg.js > www/scripts/lib/d3-and-svg.js &
babel www/scripts6/main.js > www/scripts/main.js &
# Wait for all children
wait
echo END
    
por 04.09.2015 / 03:44