Comment puis-je citer ou regrouper automatiquement des arguments de ligne de commande pour un alias dans bash?

StackOverflow https://stackoverflow.com/questions/290187

  •  08-07-2019
  •  | 
  •  

Question

J'ai un script qui prend une commande et l'exécute sur un hôte distant. Cela fonctionne bien, par exemple:

$ rexec "ant build_all"

exécutera le " ant build_all " commande sur le système distant (en le passant par SSH, etc.).

Parce que je suis paresseux, je souhaite configurer un alias pour cette commande (et, éventuellement, plusieurs autres), tel que, par exemple, je puisse simplement appeler

.
$ rant build_all

et bash il invoquera automatiquement

alias rant=rexec ant

J'ai essayé de faire cela avec un alias, mais si je définis

$ rant build_all -Dtarget=Win32
(interpreted as:)
$ rexec "ant" build_all -Dtarget=Win32

puis tous les arguments passés à " rant " sera juste ajouté à la fin, comme ceci:

<*>

Cela échoue car rexec ne prend en réalité qu'un argument et ignore les autres.

Je pourrais probablement le faire avec un script d’enveloppement bash, mais je me demandais si bash disposait de fonctions intégrées pour le faire pour moi, peut-être une version de alias avec arguments nommés, ou une commande de chaîne de citation de type perl (par exemple: qw / /), ou quelque chose comme ça.

Était-ce utile?

La solution

Pour tous les arguments, cela fonctionnera.

function rant () {
    rexec "ant $*"
}

Vous devrez peut-être ajuster les guillemets en fonction des arguments que vous transmettez.

Autres conseils

J'ai fini par utiliser la réponse de Ken G, mais une meilleure: définir rex en tant que fonction, comme suit:

function rex {
    run_remote.sh -c "$*"
}

m'a permis d'utiliser ensuite rexec dans les alias, comme ceci:

alias rant="rex ant"

et continuez à envelopper les arguments de la façon dont j'ai besoin d'eux.

J'ai oublié que je pouvais utiliser des fonctions comme celle-là dans bash. Cela fait exactement ce dont j'avais besoin, sans avoir à créer un script wrapper.

Excellent conseil, merci!

modifier: modifié " rexec " "rex", car j’ai constaté que mon système comportait déjà un programme appelé "rexec"

Vous pouvez le faire comme une fonction, pas comme un alias:

function rant { rexec "ant $1"; }

Vous pouvez l'appeler en ligne de commande comme un alias

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top