Je veux savoir si je peux passer un argument avec une commande d'alias.
par exemple:
alias d="dmesg|grep -iw usb|tail -5"
Imprime maintenant d
les 5 dernières lignes. Si je veux utiliser d pour imprimer un nombre différent de lignes, je dois à nouveau modifier la déclaration de commande d'alias d
.
Existe-t-il un moyen de modifier la déclaration d'un alias afin de ne pas avoir à retaper la déclaration pour changer le nombre de lignes. Comme incorporer le passage du nombre de lignes comme argument tout en déclarant un alias pour d
? Ou existe-t-il une autre méthode pour résoudre ce problème?
command-line
bash
alias
srk_cb
la source
la source
Réponses:
Les alias ne prennent pas d'arguments. Avec un alias comme
alias foo='bar $1'
, le$1
sera étendu par le shell au premier argument du shell (qui n'est probablement rien) lorsque l'alias est exécuté.Donc: utilisez plutôt des fonctions .
num=${1:-5}
utilise le premier argument, avec une valeur par défaut de 5 s'il n'est pas fourni.Ensuite, vous pouvez faire:
Ou, si vous modifiez légèrement les options que vous avez utilisées:
Ensuite, vous pouvez passer des
-n
options supplémentaires :Si plusieurs
-n
options sont spécifiées pourtail
, seule la dernière est utilisée.la source
~/.bashrc
-à- dire ourc.local
ou où?Vous devez avoir une fonction pour cela comme décrit dans le SO et ici . Essayez ce qui suit:
et appelez le
foo
avec:la source
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 .
Points clés qui se produisent ici:
read
intégré pour lire une chaîne dans une variabled
. Parce que nous voulons lire une chaîne complète comprenant des caractères vides (sauts de ligne, tabulations, espaces), nous utilisonsIFS=
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"
{ list; }
structure (qui est connue commegroup command
dans lebash
manuel). Notez que l'espace devant{
et;
une liste individuelle de commandes sont requis.Dans votre exemple spécifique, nous pourrions faire:
Nous pourrions également utiliser la division des mots pour stocker les arguments séparés par des espaces:
Ou nous pourrions utiliser des tableaux pour fournir plusieurs arguments:
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.
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.
la source