&& não funciona com & do script de segundo plano

1

Eu tenho este script:

cd foo && git pull && node server.js & && pid=$! && echo "$pid"

mas o bash não parece gostar desta parte: & && ... então eu mudei para isso:

set -e
cd foo
git pull
node server.js &
pid=$!
echo "$pid"

mas existe uma maneira de fazer isso com duplo e comercial && ?

Talvez o objetivo da pergunta seja se esses dois são equivalentes:

cd foo && git pull && node server.js & && pid=$! && echo "$pid"
cd foo && git pull && ( node server.js & ) && pid=$! && echo "$pid"

Meu palpite é que eles não são equivalentes.

    
por Alexander Mills 14.09.2018 / 21:32

2 respostas

4

cmd1 && cmd2 significa "do cmd1 e, se for bem-sucedido, faça cmd2 ". Não se sabe se um comando foi bem-sucedido até que tenha terminado de executar, portanto, não faz sentido colocar um comando em segundo plano e fazer com que a execução do próximo comando dependa de o primeiro ter êxito.

Parece que o que você realmente quer fazer é "iniciar cmd1 em segundo plano e, em seguida, fazer cmd2 ". Isso é apenas cmd1 & cmd2 .

Assim, aqui está o comando que você deseja: cd foo && git pull && node server.js & pid=$! && echo "$pid"

    
por 14.09.2018 / 22:41
3

O espaço em branco é gratuito. IMO, para uma longa lista de comandos como essa, ajuda na legibilidade da ajuda. Mesmo quando você quiser usar && para o significado lógico: por exemplo

cd foo &&
git pull && {
    node server.js &
    pid=$!
    echo "$pid"
}

Isso só entra no bloco node se cd e git tiverem êxito.

Nesse cenário, acho que isso torna set -e menos útil, já que você mesmo está lidando com os códigos de retorno.

    
por 15.09.2018 / 00:26