Contournement des limitations d'alias avec la commande group et here-string
Les alias ne peuvent pas accepter d'arguments, mais nous pouvons «simuler» cela. Prenons par exemple l'exemple de ma réponse à cette question .
alias mkcd='{ IFS= read -r d && mkdir "$d" && cd "$d"; } <<<'
Points clés qui se produisent ici:
- nous utilisons
read
intégré pour lire une chaîne dans une variable d
. Parce que nous voulons lire une chaîne complète comprenant des caractères vides (sauts de ligne, tabulations, espaces), nous utilisons IFS=
et désactivons les retours arrière avec barre oblique inverse -r
.
<<<
qui est ici l'opérateur de chaîne nous permet de rediriger la chaîne que nous fournissons comme argument vers l' mkcd
alias; l'utilisation serait aussimkcd "some directory"
- plusieurs commandes au sein d'un alias sont combinées et exécutées dans le shell actuel en utilisant la
{ list; }
structure (qui est connue comme group command
dans le bash
manuel). Notez que l'espace devant {
et ;
une liste individuelle de commandes sont requis.
Dans votre exemple spécifique, nous pourrions faire:
alias d='{ IFS= read -r n; dmesg | grep -iw "usb" | tail -n ${n:-5};} <<<'
Nous pourrions également utiliser la division des mots pour stocker les arguments séparés par des espaces:
bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";} <<< "arg1 arg2"
arg1
arg2
Ou nous pourrions utiliser des tableaux pour fournir plusieurs arguments:
bash-4.3$ { read -a arr; echo "${arr[1]}"; echo "${arr[0]}";} <<< "arg1 arg2"
arg2
arg1
Mais est-ce une bonne approche?
Pas nécessairement. Le problème avec une telle approche est qu'elle est très spécifique - les arguments ne peuvent pas être cités facilement, ce qui signifie que nous ne pouvons avoir que des arguments sans espaces.
bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";} <<< "'arg1 with space' arg2"
'arg1
with space' arg2
Ce n'est bien sûr pas quelque chose qui serait largement utilisé, simplement parce que dans le monde réel, nous devons faire face à des arguments complexes, donc cette approche n'est pas tout à fait pratique. Les fonctions sont beaucoup plus flexibles. Et la nécessité de citer la chaîne args devient rapidement agaçante.
Malgré les limitations, cela fonctionne avec des chaînes simples comme arguments où nous pouvons nous permettre de séparer les mots, ce qui nous permet donc partiellement de donner des arguments aux alias.