Bash (linha única): Execute o segundo comando se o primeiro for bem-sucedido, execute o terceiro caso não seja?

6

Eu quero executar dois comandos, um após o outro, via SSH. Eu não tenho um shell interativo. O segundo comando só deve ser executado se o primeiro for bem-sucedido, mas a linha estiver dentro de um script, portanto, gostaria de receber um feedback fácil de usar se o segundo comando não for executado dessa maneira. Depois disso, o restante do script deve continuar sendo executado, portanto, exit etc. não é uma opção aqui.

Eu sei que posso usar o operador booleano && , por exemplo foo && bar para impedir que bar seja executado se foo falhar e bar || baz executar baz apenas na falha de bar . No entanto, estou um pouco confuso sobre como eles funcionam em conjunto.

Para resumir:

(executado via SSH sem um shell interativo)

  1. Executar foo
  2. Executar bar SOMENTE se foo for bem-sucedida
  3. Execute baz SOMENTE se foo falhar e impedir a execução de bar

ssh user@host "foo && bar || baz"

Esta é uma maneira correta de fazer o que acabei de descrever?

    
por rld. 14.07.2013 / 20:38

2 respostas

12

Usando seu exemplo foo && bar || baz executará baz se bar ou foo falhar. Com base na sua descrição, isso não é o que você quer. Você pode realizar sua meta usando uma declaração if :

if foo; then
    bar
else
    baz
fi

Ou se você quiser em uma linha:

if foo; then bar; else baz; fi
    
por 14.07.2013 / 20:45
3

A sintaxe completa do shell script está disponível para você no comando ssh . (Os comandos são executados pelo shell padrão da conta remota; estamos assumindo aqui que é sh -compatible.)

Os comandos Compund precisam ser citados. Embora seu uso de aspas duplas esteja correto, eu recomendaria aspas simples, pois elas protegem todos os caracteres especiais do shell; isso pode ser importante se você quiser usar construções de shell não triviais em seus comandos remotos.

Com isso fora do caminho, aqui está uma maneira de fazer o que você quer:

ssh user@host 'foo && bar || { echo foo failed >&2; baz; }'

Você também pode usar condicionais complexos arbitrariamente:

ssh user@host '
    if foo; then
         bar
    else
        echo foo failed >&2
        baz
    fi'

(Sim, é uma string única de várias linhas dentro de aspas simples.)

    
por 15.07.2013 / 14:08