Bash: utiliser un alias dans une variable

9

J'écris un script bash qui exécute chacun de ses arguments en tant que commande. Cela fonctionne pour les commandes dans my PATH, mais pas pour les alias. Je peux appeler directement un alias dans le script, mais je ne peux pas appeler un alias qui a été passé en argument.

Le problème (je suppose) est que les alias sont développés avant les variables. Existe-t-il un moyen d'exécuter des alias à partir d'une variable?

Exemple de script:

#!/bin/bash
# File: runall

shopt -s expand_aliases
source ~/.aliases

while (( "$#" )); do
    $1
    shift
done

runall "echo test"fonctionne, mais runall "myalias"donnerunall: line 8: myalias: command not found

Jayson
la source

Réponses:

9

Après quelques tests, j'ai conclu ce qui suit:

  • Les alias ne fonctionnent qu'en mode interactif (ajouter -iau shebang).
  • Les alias ne sont pas évalués lorsqu'ils proviennent d'une source interprétée (dans ce cas, la variable.
  • Vous pouvez demander à bash d'utiliser l'alias eval $1. Notez que evaltout ce qui est créé avec une variable est dangereux, mais comme tout le point du script nécessite une exécution arbitraire, je n'en ferai pas trop l'affaire.

Depuis la page de manuel de bash:

Les alias ne sont pas développés lorsque le shell n'est pas interactif, sauf si l'option de shell expand_aliases est définie à l'aide de shopt (voir la description de shopt sous SHELL BUILTIN COMMANDS ci-dessous).

Vous pouvez donc ajouter à la shopt -s expand_aliasesplace de -i.

Aussi,

Les alias sont développés lors de la lecture d'une commande et non lors de son exécution.

Étant donné que les variables ne sont pas développées avant la lecture de la commande, elles ne seront pas développées davantage à l'aide de l'alias.

Kevin
la source
1
Bon à savoir. Par curiosité: pourquoi est-il dangereux pour les evalvariables?
1
@hesse Considérez eval "echo $1". Dis que j'appelle ./script.sh "hello;rm -rf ~. Qu'est-ce qui est exécuté? echo hello, suivi de rm -rf ~. C'est évidemment un exemple artificiel, mais le principe tient.
Kevin
ajoutant evaldevant $1travaillé, puisque je l'avais déjà fait shopt -s expand_aliases. Merci!
Jayson
1

J'ai eu un problème similaire et j'ai réussi à résoudre mon problème en transformant mes alias en fonctions, comme décrit sur ce site , qui a fonctionné pour moi.

par exemple

alias lsd="ls -lash"

à

function lsd() { ls -lash; }
aydow
la source