Eu preciso executar um número de comandos do shell canalizado de um script não-BASH (ou seja, script PHP) como estes:
command1 | command2 | command3
de modo que, se command1
falha com um código de saída diferente de zero, o outro comando também falha. Até agora, o que eu tenho é:
set -o pipefail && command1 | command2 | command3
Mas apesar de funcionar bem no terminal, ele produz isso se executado a partir do script:
sh: 1: set: Opção ilegal -o pipefail
linux
command-line
shell
pipe
Desmond Hume
fonte
fonte
/bin/sh
não gostaset -o pipefail
. É realmentebash
disfarçado, ou é uma casca diferente? Quandobash
é executado como/bin/sh
aceitaset -o pipefail
?/bin/sh set -o pipefail
diz/bin/sh: 0: Can't open set
(mesma coisa comsudo
). Espero ter testado direito. O sistema é o Ubuntu 12./bin/sh -c "set -o pipefail"
; como estava, o shell estava tentando executar um script no diretório atual chamadoset
e não encontrou./bin/sh -c "set -o pipefail"
não está funcionando, no entantobash -c "set -o pipefail"
faz./bin/sh
que não reconheceset -o pipefail
. Conseqüentemente, você precisará garantir que o script seja executado por/bin/bash
ao invés de/bin/sh
. Ou, se você estiver confiante, corajoso - e provavelmente imprudente - mude/bin/sh
para ser um link para, ou cópia de,/bin/bash
em vez de qualquer shell que esteja atualmente vinculado ou uma cópia dele. Se você tem certeza de que/bin/sh
ébash
, então você está usando um comportamento quebash
não expõe quando executado como/bin/sh
; usarbash
Comobash
.Respostas:
Da linha de comando do Bash você precisaria invocar um subshell para evitar
pipefail
sendo definido depois:Isso limitaria o efeito do
pipefail
opção para o subshell criar pelos parênteses(...)
.Um exemplo real:
Se você usar uma chamada shell explícita com o
-c
opção você não precisa de um subshell, seja combash
ou com umsh
alias parabash
:Desde o seu
sh
não aceita opipefail
opção, eu teria que assumir que é alguma versão mais antiga ou modificada debash
- ou que na verdade é alguma outra casca completamente.fonte
$
na primeira parte, uma parte do comando é apenas um prompt de shell? Tentei nos dois sentidos, realmente não funcionou. obash -c
maneira sempre funciona, não muito elegante tho ..Não tenho certeza porque não foi mencionado acima, mas é possível explicitamente desfeito
pipefail
usandoset +o pipefail
.Se você estiver executando um fragmento e não tiver certeza
pipefail
já definido, você pode usar isso com o subshell como sugerido anteriormente:fonte
Você pode usar $ (command1) combinado com $? :
Imprime "abc"
Imprime "".
"[$? -eq 0] & amp; & amp;" significa que o seguinte comando é executado apenas se o anterior for bem sucedido.
Isso não responde à sua pergunta, mas é uma solução para o seu problema.
fonte
command1 && command2 && command3