Je veux exécuter un alias dans une bash -c
construction.
Le bash
manuel dit:
Les alias ne sont pas développés lorsque le shell n'est pas interactif, sauf si l'
expand_aliases
option shell est définie à l'aide deshopt
Dans cet exemple, pourquoi l'alias hi
n'est-il pas trouvé lors de la définition expand_aliases
explicite?
% bash -O expand_aliases -c "alias hi='echo hello'; alias; shopt expand_aliases; hi"
alias hi='echo hello'
expand_aliases on
bash: hi: command not found
Je cours GNU bash, version 5.0.0(1)-release (x86_64-pc-linux-gnu)
.
Contexte: je veux pouvoir exécuter un alias à priorité inactive, par exemple un script contenant:
#!/bin/bash
exec chrt -i 0 nice -n 19 ionice -c 3 bash -c ". ~/.config/bash/aliases; shopt -s expand_aliases; $(shell-quote "$@")"
Je veux éviter d'utiliser bash -i
car je ne veux pas que je .bashrc
sois lu.
bash -c "hi () { echo hello; }; hi"
sortieshello
.zsh
: les alias zsh ne se développent pas même avec une optioncomplete_aliases
Réponses:
Cela ne semble pas fonctionner si vous définissez l'alias sur la même ligne que celle utilisée. Probablement quelque chose à voir avec la façon dont les alias sont développés très tôt dans le traitement de la ligne de commande, avant l'étape d'analyse réelle. Sur un shell interactif:
Notez que l'alias utilisé est en retard d'une ligne: sur la deuxième commande, il ne trouve pas l'alias qui vient d'être défini, et sur la troisième commande, il utilise celle qui a été précédemment définie.
Donc, cela fonctionne si nous mettons une nouvelle ligne dans la
-c
chaîne:(Vous pouvez également utiliser
bash -O expand_aliases -c ...
au lieu d'utilisershopt
dans le script, pas que cela aide avec la nouvelle ligne.)Alternativement, vous pouvez utiliser une fonction shell au lieu d'un alias, ils sont bien meilleurs à d'autres égards également:
la source
Transformer mon commentaire en réponse, comme l'a suggéré ilkkachu.
Le manuel Bash (lié à dans la question) fournit une explication de la façon dont les alias sont traités lorsqu'il existe une définition d'alias et une commande sur la même ligne.
Citation (légèrement formatée pour plus de clarté):
La réponse d'ilkkachu fournit plusieurs solutions possibles à ce problème.
la source