2008-11-14 8 views
3

J'ai un script qui prend une commande et l'exécute sur un hôte distant. Il fonctionne très bien, par exemple:Comment est-ce que je peux citer ou grouper automatiquement des arguments de ligne de commande pour l'alias dans bash?

$ rexec "ant build_all" 

exécutera la commande « ant build_all » sur le système distant (en passant à travers SSH, etc.).

Parce que je suis paresseux, je veux mettre en place un alias pour cette commande (et en fin de compte, plusieurs autres), de sorte que, par exemple, je peux invoquer

$ rant build_all 

et bash il sera invoquer automatiquement

$ rexec "ant build_all" 

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

alias rant=rexec ant 

alors tout arguments passés à « diatribe » seront simplement ajoutés à la fin, comme suit:

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

Cela échoue, car rexec prend vraiment juste un argument, et ignore les autres. Je pourrais probablement faire cela avec un script bash wrapper, mais je me demandais si bash avait des built-ins pour faire cela pour moi, peut-être une version named-argument d'alias, ou une commande de chaîne de citation perl-like (par exemple qw//), ou une autre.

+0

en fait, je reste des informations importantes: rexec est en fait un alias pour une autre commande, comme si: alias rexce = "run_remote.sh -c" mais il prend toujours une seule chaîne comme argument. Ceci est important pour la solution acceptée, ci-dessous, avec ma modification. – glamdringlfo

Répondre

3

Pour tous les arguments, cela fonctionnera.

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

Vous devrez peut-être ajuster les guillemets, selon les arguments que vous passez.

+0

Je l'ai utilisé, mais avec une généralisation importante. Merci! – glamdringlfo

+0

(puisque je ne peux pas accepter ma propre réponse, regardez ci-dessous pour cela) – glamdringlfo

0

Vous pouvez le faire en fonction, et non un alias:

function rant { rexec "ant $1"; } 

Vous pouvez appeler à la ligne de commande comme un alias

2

J'ai fini à l'aide de la réponse de Ken G, mais mieux: définir rex en fonction, comme ceci:

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

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

alias rant="rex ant" 

et encore l'avoir enveloppent les arguments de la façon dont j'ai besoin d'eux. J'ai oublié que je pourrais utiliser des fonctions comme ça dans bash. Cela fait exactement ce dont j'avais besoin, sans avoir à créer un script wrapper.

Bon conseil, merci!

modifier: changé « rexec » à « rex », parce que je trouve que mon système avait déjà un programme appelé « rexec »

Questions connexes