3

Я читал этот вопрос и ответ: zsh - назначение переменных не работает. Пост объясняет, как это исправить, но не почему. Почему в этом случае происходит сбой присвоения локальной переменной?

Есть также несколько других примеров подобного поведения:

myfun()
{
local x=$(echo "a b"); echo ${x} 
}

myfun2()
{
local x 
x=$(echo "a b")
echo ${x}
}

myfun3()
{
local x=$(echo "a b")
echo ${x}
}

Это приводит к следующему выводу:

a
a b
a

Если во всех случаях я ставлю кавычки вокруг 'x = "$(echo" a b ")", я получаю правильное назначение переменной.

Если я запускаю то же самое в bash, я получаю «a b» для всех функций.

Может кто-нибудь объяснить, почему bash и zsh ведут себя здесь по-разному?

1 ответ1

1

Если вы запустите свой скрипт с -x (как bash и zsh), вы увидите, что код $ (...) интерпретируется / анализируется по-разному. Это связано с тем, что, как указано в FAQ, разделение слов в zsh несовместимо с обратным / bash / sh.

Вы можете использовать SH_WORD_SPLIT для устранения этой разницы.

Итак, это не проблема разделения слов, так как у нас есть подстановка команд, снова цитируя документы :

...Если подстановка не заключена в двойные кавычки, вывод разбивается на слова с использованием параметра IFS ...

Таким образом, ваша альтернатива local IFS="" :/

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .