executando comandos consecutivamente em um bash [duplicado]

2

O seguinte bash permite executar os comandos 1,2,3 em todas as pastas que tem nomes incluídos no arquivo "list.txt"

#!/bin/bash
cat list.txt | while read i 
do
command1 &
command2 &
command3 &
done

Os comandos 1,2,3 no código estão sendo executados juntos em todas as pastas que possuem nomes incluídos no arquivo "list.txt". Como os comandos podem ser executados um por um em todas as pastas (ou seja, quando o primeiro comando termina o segundo comando e assim por diante ...). Eu tentei usar "espera" entre os comandos, mas não funcionou! A solução sugerida aqui Executando comandos consequentemente em várias pastas não funcionou bem! Eu estou procurando outra solução

    
por Community 11.07.2016 / 22:49

4 respostas

2
while read -r i #read directory as a raw line
do
    cd "$i"     #cd into the directory
    command1    #run the commands consecutively
    command2
    command3
    cd -        #cd back
done < list.txt

Se você deseja executar o processo de todos os diretórios simultaneamente (com o comando 1 até 3 permanecendo consecutivos), substitua:

    command1   
    command2
    command3

com

    (
    command1   
    command2
    command3
    )&
    
por 11.07.2016 / 23:03
3

Remova o & para que o próximo comando seja executado após a conclusão do anterior.

    
por 11.07.2016 / 22:59
3

Se você quer apenas executá-los em seqüência, mas ainda em segundo plano, e não se importa com o valor de retorno de cada comando, você pode fazer isso:

#!/bin/bash
cat list.txt | while read i 
do
    { command1; command2; command3; } &
done

Se você quiser que apenas command2 seja executado se command1 for bem-sucedido, use && :

#!/bin/bash
cat list.txt | while read i 
do
    command1 && command2 && command3 &
done

Se você deseja executar tudo de forma síncrona e em primeiro plano, basta remover o & completamente:

#!/bin/bash
cat list.txt | while read i 
do
    command1
    command2
    command3
done
    
por 11.07.2016 / 23:06
2

Se você deseja que os comandos restantes sejam executados somente se os anteriores forem bem-sucedidos, então o operador && é o caminho a seguir.

command 1 &&
command 2 &&
command 3

então, command 2 será executado somente se command 1 retornar 0 (que é bem-sucedido) e command 3 será executado somente se command 2 retornar 0. E isso significa que command 2 aguarda até command 1 ter terminou a corrida.

    
por 11.07.2016 / 23:01

Tags