httpstatus - Códigos de estado de shell en make
status code created (6)
Creo que estas buscando el $?
Variable de shell, que da el código de salida del comando anterior. Por ejemplo:
$ diff foo.txt foo.txt
$ echo $?
0
Para usar esto en tu makefile, deberías escapar de $
, como en $$?
:
all:
diff foo.txt foo.txt ; if [ $$? -eq 0 ] ; then echo "no differences" ; fi
Tenga en cuenta que cada comando en el cuerpo de su regla en make se ejecuta en una subshell separada. Por ejemplo, lo siguiente no funcionará:
all:
diff foo.txt foo.txt
if [ $$? -eq 0 ] ; then echo "no differences" ; fi
Porque los comandos diff
y if
se ejecutan en diferentes procesos de shell. Si desea utilizar el estado de salida del comando, debe hacerlo en el contexto del mismo shell, como en mi ejemplo anterior.
Utilizo un Makefile (con GNU make ejecutándose bajo Linux) para automatizar mi trabajo de gruñido al refactorizar un script de Python. La secuencia de comandos crea un archivo de salida y quiero asegurarme de que el archivo de salida no se modifique frente a mis refactorizaciones.
Sin embargo, no encontré ninguna manera de obtener el código de estado de un comando para afectar un shell posterior si el comando.
La siguiente regla ilustra el problema:
check-cond-codes:
diff report2008_4.csv report2008_4.csv-save-for-regression-testing; echo no differences: =$$!=
diff -q poalim report2008_4.csv; echo differences: =$$!=
El primer ''diff'' compara dos archivos iguales, y el segundo compara dos archivos diferentes. La salida es:
diff report2008_4.csv report2008_4.csv-save-for-regression-testing; echo no differences: =$!=
no differences: ==
diff -q poalim report2008_4.csv; echo differences: =$!=
Files poalim and report2008_4.csv differ
differences: ==
Así que, obviamente, ''$$!'' es la variable incorrecta para capturar el código de estado de ''diff''. Incluso el uso de SHELL: = / bin / bash al comienzo del Makefile no resolvió el problema.
Una variable que devuelva el valor, que necesito, se usaría (si existe) en un comando ''if'' en la regla real.
La alternativa de crear un pequeño script de shell ad-hoc en lugar de escribir todos los comandos en línea en el Makefile es indeseable, pero lo usaré como último recurso.
Relacionado:
Intenta `/ $? '' Creo que el $$ está siendo interpretado por el makefile.
La variable bash es $?
, pero ¿por qué quieres imprimir el código de estado de todos modos?
No olvide que cada uno de sus comandos se ejecuta en subshells separados.
Es por eso que a menudo ves algo como:
my_target:
do something /
do something else /
do last thing.
Y cuando realice la depuración, no olvide cada opción útil -n que imprimirá los comandos pero no los ejecutará, y la opción -p que le mostrará el entorno completo de creación, incluido el lugar donde se han establecido los distintos bits y piezas.
HTH
aclamaciones,
Si está pasando el código de resultado a un if
, simplemente podría hacer:
all:
if diff foo.txt foo.txt ; then echo "no differences" ; fi
Utilice ''$$?'' en lugar de ''$$!'' (gracias a la 4ta respuesta de Exit Shell Script basado en el código de salida del proceso )