La $?
variable contient l'état de sortie de la dernière commande d'exécution. Y a-t-il une variable qui détient la dernière commande d'exécution elle-même?
bash
shell
scripting
environment-variables
Eimantas
la source
la source
Réponses:
Utilisez
fc
pour obtenir la ligne de commande précédente. Il est normalement utilisé pour éditer la ligne de commande précédente dans votre éditeur préféré, mais il a aussi un mode "liste":last_command="$(fc -nl -1)"
la source
caller
et les tableaux de bashBASH_LINENO
,BASH_SOURCE
etFUNCNAME
de faire une sorte de trace de la pile.Si la dernière commande a été exécutée sans arguments, elle sera enregistrée dans la
$_
variable. Il contient normalement le dernier argument de la commande précédente - donc s'il n'y avait pas d'arguments, la valeur de$_
est la dernière commande elle-même.Une autre option consiste à connaître les détails de la dernière commande d' arrière-plan . Comme l'a écrit l0b0,
$!
contient son PID - vous pouvez donc analyser la sortie deps $!
(éventuellement avec des options de formatage supplémentaires pourps
).la source
Non, mais vous pouvez l'obtenir lors de l'exécution pour le stocker pour d'autres commandes:
$0
: Chemin du script shell actuel.$FUNCNAME
: "Nom de la fonction actuelle.""$@"
: Tous les paramètres de la commande en cours, cités séparément.$!
: "PID (ID de processus) du dernier travail exécuté en arrière-plan."$$
: "ID de processus (PID) du script lui-même."La commande complète du script actuel devrait donc être
"$0" "$@"
. Si c'est une fonction, ça devrait l'être"$FUNCNAME" "$@"
. Vous souhaiterez peut-être le stocker dans un tableau pour un traitement ultérieur. Par exemple, stockez-le danstest.sh
:Lors de l'exécution
./test.sh "first argument" "second argument"
, il devrait retourner:Ce sont des appels équivalents.
la source
BASH_COMMAND
variable, mais ne semble d'aucune façon utile, à part l'utilisation dans les pièges.some-command
un script shell et qu'il échoue. Je vais avoir un statut différent de zéro$?
, est-ce que "non" restera valable pour l'existence d'une détention variablesome-command
?Le
DEBUG
piège vous permet d'exécuter une commande juste avant toute exécution de commande simple. Une version chaîne de la commande à exécuter (avec des mots séparés par des espaces) est disponible dans laBASH_COMMAND
variable.Notez que
previous_command
cela changera à chaque fois que vous exécutez une commande, alors enregistrez-la dans une variable afin de l'utiliser. Si vous souhaitez également connaître l'état de retour de la commande précédente, enregistrez les deux dans une seule commande.Si vous ne souhaitez interrompre qu'une commande ayant échoué, utilisez
set -e
pour faire quitter votre script à la première commande ayant échoué. Vous pouvez afficher la dernière commande duEXIT
piège .Une autre approche qui pourrait fonctionner pour certaines utilisations consiste à
set -x
imprimer une trace de l'exécution du script et à examiner les dernières lignes de la trace.la source
Je trouve qu'il est essentiel de trouver la dernière commande ayant échoué lors de l'utilisation des options
set -e
etset -o pipefail
, car sinon bash abandonne simplement sans aucun retour sur pourquoi, c'est donc ce que j'ai trouvé fonctionnant bien:Si vous exécutez ce qui précède, vous finirez par voir le type de sortie ci-dessous:
Le numéro de ligne n'est peut-être pas toujours précis, mais il devrait vous donner quelque chose d'assez proche pour être utile.
la source