Alias ​​bash avec un espace dans le cadre de la commande

11

J'essaie de créer un alias bash, où l'alias lui-même a un espace.

L'idée est que l'alias (ie con) représente sudo openvpn --config /path/to/my/openvpn/configs/. Ce qui se traduit par une commande lisible, lorsque l' conalias est utilisé.

c'est à dire: `con uk.conf` == `sudo openvpn --config /path/to/my/openvpn/configs/uk.conf`

Je comprends que je ne peux pas déclarer l'alias comme ceci: con ="sudo openvpn --config /path/to/my/openvpn/configs/". Les fonctions bash fonctionneraient-elles dans ce scénario? Je n'en ai jamais entendu parler, mais lors de la recherche d'une solution à ce problème mineur.

boolean.is.null
la source

Réponses:

12

Oui, vous devrez utiliser une fonction. Un alias fonctionnerait si vous vouliez ajouter un paramètre, tous les arguments donnés aux alias sont passés en tant qu'arguments au programme alias mais en tant que paramètres séparés , pas simplement ajoutés à ce qui existe. Pour illustrer:

$ alias foo='echo bar'
$ foo
bar
$ foo baz
bar baz

Comme vous pouvez le voir, ce qui a été répété l'était bar bazet non barbaz. Puisque vous souhaitez concaténer la valeur que vous transmettez au paramètre existant, vous aurez besoin de quelque chose comme:

function com(){ sudo openvpn --config /path/to/my/openvpn/configs/"$@"; }

Ajoutez la ligne ci-dessus à votre ~/.bashrcet vous êtes prêt à partir.

terdon
la source
4
Vous pouvez utiliser "$@"au lieu de "$1"pour que les arguments suivants soient également transmis. (Commentaire général, peut-être sans rapport avec le cas spécifique ici)
Toby Speight
@TobySpeight D'oh! J'aurais dû penser à cela. Merci, édité.
terdon
1
@TobySpeight juste pour clarification, cela signifie-t-il que cela com uk.conf -something elsese traduirait sudo openvpn --config /path/to/my/openvpn/configs/uk.conf -something else?
TMH
4
@ TomHart oui. $@contient tous les paramètres donnés. Voir Quelle est la différence entre $ * et $ @? .
terdon