El estado de salida de una tubería es el estado de salida del comando de la derecha. El estado de salida del comando de la izquierda se ignora.
(Tenga en cuenta que which lss | echo $?
no muestra esto. Usted correría which lss | true; echo $?
para mostrar esto. En which lss | echo $?
, echo $?
informa el estado del último comando antes de esta canalización).
La razón por la cual los shells se comportan de esta manera es que hay un escenario bastante común en el que se debe ignorar un error en el lado izquierdo. Si el lado derecho sale (o más generalmente cierra su entrada estándar) mientras el lado izquierdo todavía está escribiendo, entonces el lado izquierdo recibe una señal SIGPIPE. En este caso, generalmente no hay nada de malo: el lado derecho no se preocupa por los datos; Si el papel del lado izquierdo es únicamente para producir estos datos, entonces está bien que se detenga.
Sin embargo, si el lado izquierdo muere por algún motivo que no sea SIGPIPE, o si el trabajo del lado izquierdo no era únicamente producir datos en la salida estándar, entonces un error en el lado izquierdo es un error genuino que debe ser reportado
En simple sh, la única solución es usar una tubería con nombre.
set -e
mkfifo p
command1 >p & pid1=$!
command2 <p
wait $pid1
En ksh, bash y zsh, puede indicar al shell que realice una salida de canalización con un estado distinto de cero si algún componente de la canalización sale con un estado distinto de cero. Necesitas configurar la pipefail
opción:
- ksh:
set -o pipefail
- golpetazo:
shopt -s pipefail
- zsh:
setopt pipefail
(o setopt pipe_fail
)
En mksh, bash y zsh, puede obtener el estado de cada componente de la tubería utilizando la variable PIPESTATUS
(bash, mksh) o pipestatus
(zsh), que es una matriz que contiene el estado de todos los comandos de la última tubería (una generalización de $?
)
which lss | echo $?
,echo
se inicia antes de quewhich
haya salido; el shell que genera la línea de comandoecho
no tiene forma posible de saber cuálwhich
será el estado de salida de más adelante.