¿Es posible mantener $?inalterado el último estado de salida del comando ( ) después de una prueba?
Por ejemplo, me gustaría hacer:
command -p sudo ...
[ $? -ne 1 ] && exit $?
El último exit $?debería devolver el estado de salida de sudo, pero en su lugar siempre regresa 0(el código de salida de la prueba).
¿Es posible hacer eso sin una variable temporal?
Otro ejemplo para aclarar más:
spd-say "$@"
[ $? -ne 127 ] && exit $?
En este caso, quiero salir solo si se encuentra el primer comando (código de salida! = 127). Y quiero salir con el spd-saycódigo de salida real (puede que no lo sea
0).
EDITAR: Olvidé mencionar que prefiero una solución de queja POSIX para una mejor portabilidad.
Utilizo esta construcción en scripts donde quiero proporcionar alternativas para el mismo comando. Por ejemplo, vea mi script crc32 .
El problema con las variables temporales es que podrían sombrear otras variables, y para evitar que debas usar nombres largos, lo que no es bueno para la legibilidad del código.
[ $? -ne 127 ] && exit $?)
sudocomando tiene éxito (es decir, si sudosale con el estado 0). Pero, en su código, el script sigue ejecutándose (no sale) si sudotiene éxito
commandy no sudoen absoluto. Eso es lo que significa que quiero salir solo si se encuentra el primer comando (código de salida! = 127) y es un retorno especificado paracommand cuando no se encuentra el comando que invoca. Supongo que el problema es que invocar sudocomo parte de la prueba permite sudoaplastar el retorno commanden primer lugar y así sesgar la prueba.
if ! command -p sudo; then exit; fique tendría los mismos resultados para su ejemplo.