Comment créer un alias qui étend réellement un autre alias du même nom dans Bash?
Pourquoi:
Je l' habitude d'avoir GREP_OPTIONS
mis sur .bashrc
quelque chose comme ceci:
GREP_OPTIONS="-I --exclude=\*~"
J'avais aussi un script (disons, setup-java.sh
) que j'appellerais avant de travailler sur certains projets Java. Il contiendrait la ligne:
GREP_OPTIONS="$GREP_OPTIONS --exclude-dir=classes"
Si j'utilise également Sass, j'appellerais setup-sass.sh
qui contient la ligne:
GREP_OPTIONS="$GREP_OPTIONS --exclude-dir=\*/.sass-cache"
Mais GREP_OPTIONS
était obsolète et apparemment, la solution standard est de créer un alias ou un script ...
Réponses:
Bash stocke les valeurs des alias dans un tableau appelé
BASH_ALIASES
:Avec l' expansion des paramètres, nous pouvons obtenir le dernier alias défini (s'il existe) ou la valeur par défaut:
Maintenant, faites-le sur
setup-java.sh
:... et enfin sur
setup-sass.sh
:Si les trois lignes sont appelées, nous obtenons ce que nous voulons:
la source
aliases
chaîne si vous les terminez par des espaces.Vous pouvez écrire des scripts entiers de cette façon, si vous êtes assez fou. Quoi qu'il en soit, si vous souhaitez étendre un alias, assurez-vous simplement que l'alias que vous souhaitez étendre se termine dans un espace et clouez-en un autre.
la source
exdir
? (Est-ce juste pour l'alignement pour des raisons esthétiques?)fnmatch(){ alias fnmatch='case $1 in '; while "${1:+:}" 2>&-; do eval 'fnmatch pattern list ;; esac'; shift; done; unalias fnmatch; }; alias pattern='${1:+*}) ' list=': do stuff '; fnmatch "$@"
. Le faire avecaliases
vous permet d'utiliser les extensions des motifs de manière plus directe et plus sûre. Vous avez besoin d'un second contexte avec /eval
lorsqu'il est appelé à partir d'une fonction, mais ce n'est pas intrinsèquement dangereux tant que les nomspattern
etlist
sont contrôlés par vous. Ils ne peuvent se casser que dans la plupart des cas, même s'ils ne le sont pas, à moins qu'un attaquant ne scie correctement correctement votrecase
..bashrc
:alias sudo='sudo '
, cela me permet d' appeler toutes mes commandes crénelage après unsudo
. Sans l'espace, cela ne fonctionnerait pasUne fonction est une meilleure option qu'un alias extensible ici.
De cette façon, vous avez deux options pour ajouter des options à l'environnement:
Modifiez le
grep_options
tableau; cela prend correctement en charge les options avec des espaces, des caractères globaux littéraux et d'autres cas d'angle:Utilisez la
GREP_OPTIONS
variable scalaire traditionnelle , malgré ses pièges (voir BashFAQ # 50 pour comprendre certains d'entre eux):Cela dit, si vous voulez que vos options soient reflétées par des
grep
instances appelées en dehors du shell, ni un alias ni une fonction ne feront l'affaire. Au lieu de cela, vous voudrez un script wrapper placé plus tôt dans votre PATH que la vraiegrep
commande. Par exemple:... et, en
~/bin/grep
:la source