2010-08-08 9 views
5

Dans Bash, je peux utiliser le code suivant:chaîne Déballez dans la variable

[ "$sshcmd" = "" ] && sshcmd="ssh -someopts myhost" 

$sshcmd "echo hello world" 

En ZSH, le même code ne fonctionne pas parce qu'il essaie de trouver un « ssh -someopts myhost » exécutable. Comment puis-je faire la même chose dans ZSH?

Merci, Albert

+0

S'il vous plaît voir [BashFAQ/050] (http://mywiki.wooledge.org/BashFAQ/050). –

+0

@Dennis: Je suis le deuxième cas mais dans mon cas, l'utilisateur passe la commande via un paramètre ou via une variable env au script. Ou s'il ne le fait pas, le script utilise une valeur par défaut. Comment pourrais-je résoudre ceci? – Albert

+0

Vous devrez probablement utiliser les suggestions dans la réponse (et le commentaire) ci-dessous (qui sont cohérentes avec les informations de ce lien). Cependant, vous devez savoir que l'exécution de commandes passées en arguments peut avoir des conséquences sur la sécurité. –

Répondre

2

Pour diviser une chaîne à des espaces (plus généralement, à $IFS) comme les autres coquilles: $=sshcmd

Mais vous devriez plutôt faire sshcmd un tableau, pour que vos commandes fonctionne toujours si l'on des options contient des espaces blancs:

sshcmd=(ssh -someopts myopts) 
$sshcmd[@] "echo hello world" 

Cela vaut pour bash et ksh aussi, par la voie; mais il vous faut également protéger la substitution variable de tableau contre une nouvelle expansion de la division et le nom de fichier:

sshcmd=(ssh -someopts myopts) 
"${sshcmd[@]}" "echo hello world" 
+0

Je reçois cela via un environnement de Bash, donc je pense qu'un tableau n'est pas une option (ou comment puis-je le convertir automatiquement?). Mais '$ = sshcmd' fonctionne, merci! – Albert

+1

@Albert Pour diviser quelque chose comme le shell, utilisez '$ {(z) sshcmd}'. Il gérera le cas où sshcmd contient des paramètres quoted: si sshcmd contient une chaîne 'a 'bc d'', '$ = sshcmd' le divisera en' a', '' b',' c', 'd'' , alors que '$ {(z) sshcmd}' dans 'a',' 'bc d''. Il gère également '$ (...)', '" ... "', etc; voir la section PARAMETER EXPANSION dans man zshexpn. – ZyX

+0

Merci @ZyX, cela semble beaucoup plus utile! – Albert

Questions connexes