Расширение переменной в zsh отличается от расширения в bash - PullRequest
13 голосов
/ 16 июля 2011

Ниже приведен простой тестовый пример того, что я хочу проиллюстрировать.

В bash,

# define the function f
f () { ls $args; }

# Runs the command `ls`
f

# Runs the fommand `ls -a`
args="-a"
f

# Runs the command `ls -a -l`
args="-a -l"
f

Но в zsh

# define the function f
f () { ls $args }

# Runs the command `ls`
f

# Runs the fommand `ls -a`
args="-a"
f

# I expect it to run `ls -a -l`, instead it gives me an error
args="-a -l"
f

Последняя строкав zsh выше дает мне следующую ошибку

ls: invalid option -- ' '
Try `ls --help' for more information.

Я думаю, что zsh выполняет

ls "-a -l"

, когда я получаю ту же ошибку.

Таккак мне понять поведение bash здесь?

Я не уверен, если я ясен, дайте мне знать, если вы хотите что-то узнать.

1 Ответ

30 голосов
/ 16 июля 2011

Разница в том, что (по умолчанию) zsh не выполняет разбиение слов для раскрытия параметров без кавычек.

Вы можете включить «нормальное» разделение слов, установив параметр SH_WORD_SPLIT или используяфлаг = для отдельного расширения:

ls ${=args}

или

setopt SH_WORD_SPLIT
ls $args

Если ваши целевые оболочки поддерживают массивы ( ksh , bash , zsh ), тогда вам может быть лучше использовать массив:

args=(-a -l)
ls "${args[@]}"

Из zsh FAQ :

Из zsh Руководство :

  • 14.3 Расширение параметров

    Обратите внимание, в частности, на то, что слова без кавычек параметров не разделяются автоматически на пробел, если не установлена ​​опция SH_WORD_SPLIT;см. ссылки на эту опцию ниже для более подробной информации.Это важное отличие от других оболочек.

  • SH_WORD_SPLIT

    Вызывает разделение полей при раскрытии параметров без кавычек.

...