Estoy tratando de hacer eco del último comando ejecutado dentro de un script bash. Encontré una manera de hacerlo con algunos history,tail,head,sed
que funcionan bien cuando los comandos representan una línea específica en mi script desde el punto de vista del analizador. Sin embargo, en algunas circunstancias no obtengo el resultado esperado, por ejemplo, cuando el comando se inserta dentro de una case
declaración:
La secuencia de comandos:
#!/bin/bash
set -o history
date
last=$(echo `history |tail -n2 |head -n1` | sed 's/[0-9]* //')
echo "last command is [$last]"
case "1" in
"1")
date
last=$(echo `history |tail -n2 |head -n1` | sed 's/[0-9]* //')
echo "last command is [$last]"
;;
esac
La salida:
Tue May 24 12:36:04 CEST 2011
last command is [date]
Tue May 24 12:36:04 CEST 2011
last command is [echo "last command is [$last]"]
[P] ¿Alguien puede ayudarme a encontrar una manera de repetir el último comando de ejecución independientemente de cómo / dónde se llame este comando dentro del script bash?
Mi respuesta
A pesar de las contribuciones muy apreciadas de mis compañeros SO'ers, opté por escribir una run
función, que ejecuta todos sus parámetros como un solo comando y muestra el comando y su código de error cuando falla, con los siguientes beneficios:
-Sólo necesito anteponer los comandos que quiero verificar con lo run
que los mantiene en una línea y no afecta la concisión de mi script
-Siempre que el script falla en uno de estos comandos, la última línea de salida de mi script es un mensaje que muestra claramente qué comando falla junto con su código de salida, lo que facilita la depuración
Script de ejemplo:
#!/bin/bash
die() { echo >&2 -e "\nERROR: $@\n"; exit 1; }
run() { "$@"; code=$?; [ $code -ne 0 ] && die "command [$*] failed with error code $code"; }
case "1" in
"1")
run ls /opt
run ls /wrong-dir
;;
esac
La salida:
$ ./test.sh
apacheds google iptables
ls: cannot access /wrong-dir: No such file or directory
ERROR: command [ls /wrong-dir] failed with error code 2
Probé varios comandos con múltiples argumentos, variables bash como argumentos, argumentos entre comillas ... y la run
función no los rompió. El único problema que encontré hasta ahora es ejecutar un eco que se rompe, pero no planeo comprobar mis ecos de todos modos.
run()
no funciona correctamente cuando se utilizan comillas, por ejemplo, esto no funciona:run ssh-keygen -t rsa -C info@example.org -f ./id_rsa -N ""
.