Réponses:
Les alias sont comme des commandes en ce sens que tous leurs arguments sont passés en argument au programme qu'ils alias. Par exemple, si vous deviez alias ls
à ls -la
, puis en tapant ls foo bar
serait vraiment exécuter ls -la foo bar
sur la ligne de commande.
Si vous voulez avoir un contrôle réel sur la façon dont les arguments sont interprétés, vous pouvez écrire une fonction comme ceci:
my_program_wrapper() {
local first_arg="$1" \
second_arg="$2"
shift 2 # get rid of the first two arguments
# ...
/path/to/my_program "$@"
}
Alias solution
Si vous êtes vraiment contre l'utilisation d'une fonction en tant que telle, vous pouvez utiliser:
$ alias wrap_args='f(){ echo before "$@" after; unset -f f; }; f'
$ wrap_args x y z
before x y z after
Vous pouvez remplacer $@
par $1
si vous ne voulez que le premier argument.
Explication
Cela crée une fonction temporaire f
, à laquelle sont passés les arguments.
Les arguments d'alias ne sont passés qu'à la fin. Notez que f
s'appelle tout à la fin de l'alias.
Le unset -f
supprime la définition de la fonction car l'alias est exécuté afin qu'il ne reste pas après.
wrap_args x y z
me donne: bash: erreur de syntaxe près du jeton inattendu `('
f
aliasé. Une fois que je suis imparti, f
cela fonctionne bien. L'ancien problème de collision de noms.
command type f
:)
Pour ajouter aux réponses actuelles, il est important de comprendre le fonctionnement des alias: tous les paramètres que vous tapez après une commande avec alias seront utilisés à la fin. Il n'y a donc aucun moyen d'utiliser alias pour deux commandes (connectées ou non), à partir desquelles la première doit interpréter les paramètres. Pour être clair, voici un exemple de quelque chose qui ne fonctionnerait pas comme prévu:
alias lsswp="ls -l | grep swp"
(un exemple inspiré de cette question ), il utilisera toujours la sortie de ls -l
performé dans le répertoire courant et fera un grep sur celui-ci - donc, utiliser
lsswp / tmp /
serait équivalent à ls -l | grep swp /tmp/
et non ls -l /tmp/ | grep swp
.
Dans tous les cas où les arguments doivent être utilisés quelque part au milieu, il faut utiliser un à la function
place de alias
.
Vous n'avez rien à faire, en fait; les alias le font automatiquement. Par exemple:
$ alias less="less -eirqM"
$ less foo.txt
Vous verrez la première page de foo.txt et quitterez less
à EOF (-e), les recherches seront insensibles à la casse (-i), etc.
Je réponds pour csh:
Oui, vous pouvez utiliser les paramètres dans les alias et, à la différence de ce qui a été dit ci-dessus, vous pouvez vous y référer n'importe où dans la définition d'alias, pas seulement à la fin.
Exemple pour tar-gz -ing quelque chose:
$ alias tgz "tar cvf - \!:1 | gzip -9 > \!:2.tar.gz"
, où !:1
et !:2
sont les paramètres que vous allez fournir lors de l’appel de votre alias.
Exemple d'utilisation:
$ ls
clrcf.dat user_comment_2016.06.03_12:51:50.txt user_comment_2016.06.03_12:54:48.txt
TEST-wADM.tec user_comment_2016.06.03_12:52:04.txt user_comment_2016.06.03_12:55:13.txt
$ tgz user* out
a user_comment_2016.06.03_12:51:50.txt 1K
a user_comment_2016.06.03_12:52:04.txt 1K
a user_comment_2016.06.03_12:54:48.txt 1K
a user_comment_2016.06.03_12:55:13.txt 1K
$ ls out*
out.tar.gz
Ce qui signifie en réalité que vous avez utilisé deux paramètres que vous avez insérés à des emplacements arbitraires de la commande tar, faisant de tout cela un alias. tgz
sh
sont définiesmy_program_wrapper() { ...; }
. Bash gère le mot clé,function
mais pourquoi ne pas utiliser ce qui est plus portable?