Как заставить bash / zsh оценивать параметр как несколько аргументов при применении к команде - PullRequest
8 голосов
/ 09 сентября 2011

Я пытаюсь запустить программу, подобную этой:

$CMD $ARGS

где $ ARGS - набор аргументов с пробелами. Однако zsh, похоже, передает содержимое $ ARGS в качестве единственного аргумента исполняемому файлу. Вот конкретный пример:

$export ARGS="localhost -p22"
$ssh $ARGS
ssh: Could not resolve hostname localhost -p22: Name or service not known

Есть ли флаг bash или zsh, который контролирует это поведение?

Обратите внимание, что когда я помещаю команду такого типа в скрипт $! / Bin / sh, она работает как положено.

Спасибо

SetJmp

Ответы [ 3 ]

10 голосов
/ 03 июня 2012

В zsh это просто:

Используйте cmd ${=ARGS}, чтобы разбить $ARGS на отдельные аргументы по слову (разбить на пробел).

Используйте cmd ${(f)ARGS}, чтобы разбить $ARGS наразделяйте аргументы за строкой (разделяйте их на новые строки, но не пробелы / табуляции).

Как уже упоминали другие, установка SH_WORD_SPLIT делает разделение слов по умолчанию, но до того, как вы это сделаете в zsh, ср.http://zsh.sourceforge.net/FAQ/zshfaq03.html для объяснения того, почему разделение пробелов не включено по умолчанию.

7 голосов
/ 09 сентября 2011

Если вы хотите разбить строковую переменную (есть также массивы) на слова перед передачей в команду, используйте $=VAR. Есть также опция (shwordsplit, если я не ошибаюсь), которая заставит любой command $VAR вести себя как command $=VAR, но я предлагаю не устанавливать его: мне очень неудобно печатать такие вещи, как command "$VAR" (zsh : command $VAR) и command "${ARRAY[@]}" (zsh: command $ARRAY).

3 голосов
/ 09 сентября 2011

Это будет работать, если вы используете eval $CMD $ARGS.

...