Dans mon ~/.bashrc
le fichier contient deux définitions:
commandA
, qui est un alias vers un chemin plus longcommandB
, qui est un alias d'un script BashJe 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?
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
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
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.