2010-08-08 4 views
5

В Bash, можно использовать следующий код:распаковывать строки в переменной

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

$sshcmd "echo hello world" 

В ZSH тот же код не работает, потому что он пытается найти «SSH -someopts MyHost» исполняемый файл. Как я могу сделать то же самое в ZSH?

Спасибо, Альберт

+0

Пожалуйста, см [BashFAQ/050] (http://mywiki.wooledge.org/BashFAQ/050). –

+0

@ Dennis: Я второй случай, но в моем случае пользователь передает команду через параметр или через env-переменную скрипту. Или, если он этого не делает, сценарий использует некоторые значения по умолчанию. Как я могу это решить? – Albert

+0

Возможно, вам придется использовать предложения в ответе (и комментарии) ниже (которые согласуются с информацией по этой ссылке). Однако вы должны знать, что есть потенциальные последствия для безопасности выполнения команд, переданных в качестве аргументов. –

ответ

2

Чтобы разбить строку на пробелы (в более общем случае, при $IFS), как и другие снаряды: $=sshcmd

Но вместо него вы должны сделать sshcmd массив, так что ваши команды по-прежнему работает, если один вариантов содержит пробелы:

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

Это относится, кстати, к bash и ksh; но вы также должны защитить замену переменной массива против дальнейшего расширения расщепления и имя файла:

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

Я получаю это через среду от Bash, поэтому я думаю, что массив не является вариантом (или как я могу автоматически его преобразовать?). Но '$ = sshcmd' работает, спасибо! – Albert

+1

@Albert Чтобы разбить что-то точно так же, как это делает shell, используйте '$ {(z) sshcmd}'. Он будет обрабатывать случай, когда sshcmd содержит заданные параметры: если sshcmd содержит строку 'a 'bc d'', '$ = sshcmd' будет разделять ее на' a', '' b',' c', 'd'' , а '$ {(z) sshcmd}' в 'a',' 'bc d''. Он также обрабатывает '$ (...)', '" ... "' и т. Д .; см. раздел РАСШИРЕНИЕ ПАРАМЕТРА в man zshexpn. – ZyX

+0

Спасибо @ZyX, это кажется гораздо более полезным! – Albert