Quelle est la valeur de retour d'un alias complexe dans bash?

2

Lorsque j'exécute une commande qui a été alias pour une série de commandes, quelle valeur est renvoyée au shell? Aussi, en supposant que j'ai un alias défini comme ceci:

alias doit 'cd ~/some/dir; ./my_app; cd -'

Comment puis-je créer la valeur de retour qui ./my_apprenvoie la valeur de retour de la commande entière avec alias?

lourd
la source

Réponses:

4

Un alias est presque une substitution textuelle. Donc, après votre définition d'alias, taper doitest équivalent à taper cd ~/some/dir; ./my_app; cd -. Ceci est une liste de commandes syntaxiquement correcte, et sa valeur de retour est la valeur de retour de la dernière commande de la séquence, ici cd -.

D'autres réponses montrent un moyen général de sauvegarder le statut d'une commande intermédiaire et de le renvoyer. Cependant, dans ce cas particulier, il existe un meilleur moyen d’exprimer cette séquence d’actions: au lieu de passer à un autre répertoire puis de revenir en arrière, exécutez l’action qui nécessite un répertoire en cours différent dans un sous-shell, de sorte que le répertoire en cours du fichier. shell ne change pas du tout.

doit () {
  (cd ~/some/dir && ./my_app "$@")
}

J'ai apporté deux améliorations supplémentaires:

  • Utilisez &&plutôt ;qu'entre les commandes, pour ne pas essayer de s'exécuter my_appsi la cdcommande échouait.
  • Autoriser les arguments à être transmis à my_app: si vous exécutez doit foo bar, my_appest appelé avec les deux arguments fooet bar.
Gilles
la source
Excellente réponse, merci! Une question: qu'est-ce qui fait que ceci est exécuté dans un sous-shell? S'agit-il de l'encapsulation des commandes entre parenthèses ou simplement du fait qu'elles sont exécutées dans une fonction shell?
Ciel lourd le
@heavyd: Les parenthèses sont la syntaxe des sous-shell. Le code dans une fonction shell n’est pas isolé de son contexte, vous pouvez par exemple exécuter cdune fonction et l’affecter à l’appelant.
Gilles
1

La valeur renvoyée est l'état de sortie de la dernière commande exécutée.

Peut-être devriez-vous utiliser une fonction à la place:

fonction doit
{
    cd ~ / some / dir
    ./my_app
    local X = $?
    cd -
    retourner X $
}

De man Bash:

$? Expands to the status of the most recently executed foreground pipeline.

Remarque: La localcommande garantit qu'aucune variable globale (de même nom) n'est modifiée.

cYrus
la source
0

Les blocs de code du shell renvoient généralement la valeur de retour de la dernière commande du bloc. Dans votre cas, c’est ce cd -qui risque peu d’échouer.

Je pense que vous pouvez obtenir ce que vous voulez en transformant cet alias en une fonction shell:

doit () {  
    cd ~/some/dir  
    ./my_app  
    RETVAL=$?  
    cd -  
    return $RETVAL  
}
Spiff
la source