web-dev-qa-db-fra.com

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

Dans mon ~/.bashrc le fichier contient deux définitions:

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

Je veux traiter le même fichier avec ces deux commandes, j'ai donc écrit le script Bash suivant:


#!/bin/bash

for file in "$@"
    do
    commandA $file
    commandB $file
done

Même après vous être déconnecté de ma session et vous être reconnecté, Bash m'invite avec command not found erreurs pour les deux commandes lorsque j'exécute ce script.

Qu'est-ce que je fais mal?

237
Zaid

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

Seconde, .bashrc n'est pas lu par les shells non interactifs sauf si vous définissez BASH_ENV variable d'environnement.

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 cassera à 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
125
user601

Si vous consultez la page de manuel bash, vous trouverez:

Les alias ne sont pas développés lorsque le shell n'est pas interactif, sauf si l'option expand_aliases shell est définie à l'aide de 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 vous procurer votre fichier d'alias après l'avoir défini dans votre script.

shopt -s expand_aliases
source ~/.bash_aliases
175
ddeimeke

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 (sauf si vous source ~/.bashrc dans le script, ce que je ne recommanderais pas mais il existe des moyens de le faire correctement).

Cependant, les fonctions peuvent être exportées et seraient disponibles pour les scripts Shell qui sont exécutés à partir d'un environnement dans lequel elles sont définies. Cela peut être fait en plaçant ceci dans votre bashrc:

 foo () 
 {
 echo "Hello World!" 
} 
 export -f foo 

Comme le dit le manuel de 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 interactif et source votre profil bash pour vous.

11
user65576