Dans mon ~/.bashrc
fichier résident deux définitions:
commandA
, qui est un alias pour un chemin plus longcommandB
, qui est un alias pour 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 la déconnexion de ma session et la reconnexion, Bash m'informe des command not found
erreurs pour les deux commandes lorsque j'exécute ce script.
Qu'est-ce que je fais mal?
source ~/.bashrc
.Réponses:
Tout d’abord, comme l’a dit Ddeimeke, les alias par défaut ne sont pas développés dans des shells non interactifs.
Deuxièmement, il
.bashrc
n'est pas lu par les shells non interactifs, sauf si vous définissez laBASH_ENV
variable d'environnement.Mais le plus important: ne faites pas ça! S'il vous plaît? Un jour, vous déplacerez ce script à un endroit où les alias nécessaires ne sont pas définis et il se brisera à nouveau.
A la place, définissez et utilisez des variables d’environnement comme raccourcis dans votre script:
la source
alias
cas d'utilisation habituels . Par exemplealias mv="mv -v --backup=numbered"
.$CMDA
/$CMDB
… Hormis les variables majuscules réservées à bash lui-même, et ça marche, ce manque de guillemets me met vraiment mal à l'aise… Merci quand même.gizmo
n'est pas sur le chemin ou il y a une commande avec le même nom mais une priorité plus haute. sinon, vous pouvez simplement mettreCMDA
en clairgizmo
en premier lieu.Si vous regardez dans la page de manuel bash, vous trouverez:
Alors mettez un
dans votre script.
Assurez-vous d’avoir source votre fichier d’alias après l’avoir défini dans votre script.
la source
shopt -s expand_aliases source ~/.bash_aliases
fonctionne parfaitement pour moi. Il existe souvent une forme de détection de shell interactive dans .bashrc telle que celle-ci:# If not running interactively, don't do anything [ -z "$PS1" ] && return
@Zaid, vous souhaiterez peut-être vérifier cela dans le fichier que vous avez acheté.shopt -s expand_aliases
n'est pas nécessaire d'aller avant la définition du pseudonyme, mais avant son utilisation. Ajout à @FrankSchubert: La détection de shell interactif peut également être effectuée en utilisant$-
les options du shell, en particulieri
si le shell est interactif.~/.bash_aliases
pourriez dépendre d’autres éléments déjà chargés sur un shell interactif ... La chose la plus proche que j’ai trouvée est de changer votre hashbang en#!/bin/bash -li
Toujours pas parfait. Idéalement, vous devriez utiliser des fonctions et non des alias.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 disponiblesyour_script.sh
(sauf si vous indiquez~/.bashrc
dans le script, ce que je ne recommanderais pas, mais il existe des moyens de le faire correctement).Toutefois, les fonctions peuvent être exportées et seraient 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:
Comme le dit le manuel de Bash, "Dans presque tous les cas, les fonctions du shell sont préférées aux alias".
la source
alias commandA=...
parcommandA() { ... }
alorsexport commandA
et vous obtenez un comportement identique à celui de l’alias. Donc, c'est à peu près une alternative identique aux pseudonymes, pour autant que je sache, qui fonctionne très bien avec les scripts bashalias b=bash
il est facile de faireb -c "echo test | grep test"
ce qui serait difficile à faire dans les fonctions.b () { bash "$@"; }
thenb -c "echo test | grep test"
Le
i
est pour interactif et sources votrebash
profil pour vous.la source
J'ai trouvé que parfois, le script bash ne reconnaît pas l'exportation non plus. Cependant, le changer pour
travaille pour moi.
la source