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
/bin/sh set -o pipefail
diz /bin/sh: 0: Can't open set
(mesma coisa com sudo
). 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 chamado set
e não encontrou.
/bin/sh -c "set -o pipefail"
não está funcionando, no entanto bash -c "set -o pipefail"
faz.
/bin/sh
que não reconhece set -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 que bash
não expõe quando executado como /bin/sh
; usar bash
Como bash
.
/bin/sh
não gostaset -o pipefail
. É realmentebash
disfarçado, ou é uma casca diferente? Quandobash
é executado como/bin/sh
aceitaset -o pipefail
?