Pourquoi mon script Bash ne reconnaît-il pas les alias?

Dans mon file ~/.bashrc résident deux définitions:

  1. commandA , qui est un alias à un path plus long
  2. commandB , qui est un alias d'un script Bash

Je veux traiter le même file avec ces deux commands, alors j'ai écrit le script Bash suivant:


 #!/bin/bash for file in $@ do commandA $file commandB $file done 

Même après avoir déconnecté ma session et se reconnecter, Bash m'invite à command not found erreur pour les deux commands lorsque j'exécuterai ce script.

Qu'est-ce que je fais mal?

Tout d'abord, comme dit ddeimeke, les alias par défaut ne sont pas développés dans des shells non interactifs.

Deuxièmement, .bashrc n'est pas lu par les shells non-interactifs, sauf si vous définissez la variable d'environnement BASH_ENV .

Mais le plus important: ne faites pas ça! S'il vous plaît? Un jour, vous déplacerez ce script quelque part où les alias nécessaires ne sont pas définis et il se brisera à nouveau.

Au lieu de cela, définissez et utilisez des variables d'environnement comme raccourcis dans votre script:

 #!/bin/bash CMDA=/path/to/gizmo CMDB=/path/to/huzzah.sh for file in "$@" do $CMDA "$file" $CMDB "$file" done 

Si vous regardez dans la page de manuel bash, vous findez:

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 en utilisant shopt (voir la description de shopt sous SHELL BUILTIN COMMANDS ci-dessous).

Alors mettez un

 shopt -s expand_aliases 

dans votre script.

Assurez-vous de fournir votre file d'alias après l'avoir configuré dans votre script.

 shopt -s expand_aliases source ~/.bash_aliases 

Les alias ne peuvent pas être exportés, ils ne sont donc pas disponibles dans les scripts shell dans lesquels ils ne sont pas définis. En d'autres termes, si vous les définissez dans ~/.bashrc ils ne sont pas disponibles pour your_script.sh (à less que vous ne fournissiez ~/.bashrc dans le script, ce que je ne reorderais pas, mais il existe des façons de le faire correctement).

Toutefois, les fonctions peuvent être exscopes et disponibles pour les scripts shell exécutés à partir d'un environnement dans lequel ils sont définis. Cela peut être fait en plaçant ceci dans votre bashrc:

 foo ()
 {
     echo "Bonjour tout le monde!"
 }
 export -f foo

Comme le dit le manuel Bash, "Pour presque tous les usages, les fonctions shell sont préférées aux alias."

 [cmd line] > bash -i [your script's file path] 

Le i est pour interactive et sources votre profil bash pour vous.

J'ai trouvé parfois le script bash ne reconnaît pas l'export non plus. Cependant, le changer en

 #!/bin/sh 

travaille pour moi.