Necesito ejecutar varios comandos de shell canalizados desde un script que no sea BASH (es decir, un script PHP) como estos:
command1 | command2 | command3
de modo que, si command1
falla con un código de salida distinto de cero, cada otro comando también falla. Hasta ahora, lo que se me ocurrió es:
set -o pipefail && command1 | command2 | command3
Pero a pesar de que se ejecuta bien desde la terminal, produce esto si se ejecuta desde el script:
sh: 1: conjunto: opción ilegal -o pipefail
/bin/sh set -o pipefail
dice /bin/sh: 0: Can't open set
(lo mismo con sudo
). Espero haberlo probado bien. El sistema es Ubuntu 12.
/bin/sh -c "set -o pipefail"
; tal como estaba, el shell intentaba ejecutar un script en el directorio actual llamado set
y no lo encontró.
/bin/sh -c "set -o pipefail"
no funciona, sin embargo, bash -c "set -o pipefail"
sí.
/bin/sh
lo que no reconoce set -o pipefail
. En consecuencia, deberá asegurarse de que el script se ejecute en /bin/bash
lugar de hacerlo /bin/sh
. O, si tiene confianza, valiente, y probablemente insensato, cambie /bin/sh
para ser un enlace o copia de, en /bin/bash
lugar de cualquier shell al que esté vinculado actualmente o una copia. Si está seguro de que /bin/sh
es así bash
, está utilizando un comportamiento que bash
no se expone cuando se ejecuta como /bin/sh
; usar bash
como bash
.
/bin/sh
no le gustaset -o pipefail
. ¿Está realmentebash
disfrazado o es un caparazón diferente? Cuandobash
se ejecuta como/bin/sh
, ¿aceptaset -o pipefail
?