2010-08-08 14 views
5

In Bash, kann ich den folgenden Code verwenden:auspacken String in Variable

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

$sshcmd "echo hello world" 

In ZSH, der gleiche Code funktioniert nicht, weil es zu finden versucht, eine ausführbare Datei "ssh myhost -someopts". Wie kann ich das gleiche in ZSH tun?

Danke, Albert

+0

Bitte siehe [BashFAQ/050] (http://mywiki.wooledge.org/BashFAQ/050). –

+0

@Dennis: Ich bin der zweite Fall, aber in meinem Fall übergibt der Benutzer den Befehl über einen Parameter oder über eine Env-Variable an das Skript. Oder wenn nicht, verwendet das Skript einen Standard. Wie würde ich das lösen? – Albert

+0

Sie müssen wahrscheinlich die Vorschläge in der Antwort (und im Kommentar) verwenden, die mit den Informationen unter diesem Link übereinstimmen. Sie sollten jedoch beachten, dass die Ausführung von Befehlen, die als Argumente übergeben werden, potenzielle Auswirkungen auf die Sicherheit haben kann. –

Antwort

2

eine Zeichenfolge in Leerzeichen nach Split (allgemein bei $IFS) wie andere Schalen: $=sshcmd

Aber Sie sollten stattdessen sshcmd ein Array machen, so dass Ihre Befehle immer noch funktioniert, wenn man der Optionen enthält Leerzeichen:

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

Dies gilt übrigens Bash und Ksh auch, übrigens; aber es muss auch die Array-Variable Substitution gegen eine weitere Aufspaltung und die Dateinamen Expansion schützen:

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

Ich bekomme dies über eine Umgebung von Bash, also denke ich, ein Array ist keine Option (oder wie kann ich es automatisch konvertieren?). Aber '$ = sshcmd' funktioniert, danke! – Albert

+1

@Albert Um etwas genau wie die Shell zu teilen, verwenden Sie '$ {(z) sshcmd}'. Es behandelt den Fall, wenn sshcmd in Anführungszeichen gesetzte Parameter enthält: Wenn sshcmd eine Zeichenkette 'a 'bc d'' enthält, wird '$ = sshcmd' es in' a', 'b',' c', 'd'' aufteilen , während '$ {(z) sshcmd}' in 'a',' 'bc d''. Es handhabt auch '$ (...)', '" ... "' usw .; siehe PARAMETER EXPANSION Sektion in man zshexpn. – ZyX

+0

Danke @ZyX, das scheint viel nützlicher zu sein! – Albert