Добро пожаловать в мир цитирования и цитирования сюрпризов.
Основная проблема заключается в том, что zsh
по умолчанию не разбивается на символы IFS.
В этом: он отличается от всех других оболочек.
Чтобы проверить, как цитирование меняет способ работы оболочки, нам нужен код, который проверяет как цитируемые, так и некотируемые версии вашего кода.
Ваш код (добавление пары переменных):
program() { printf '%02d-1: %6s 2: %6s 3: %6s' "$i" "$1" "$2" "$3"; }
runa() { program "$@" ; }
run1() { echo "`runa $1 $2 $3 `"; }
run1 'a b' c
Позвольте мне остановиться на деталях.
Предположим, вы создали локальную ссылку sh
, указывающую на место, где находится zsh
:
ln -s "/usr/bin/zsh" ./sh
А также предположим, что вы скопировали следующий сценарий в , поэтому
файл.
Сценарий, повторяющий каждую функцию с переменными в кавычках и без кавычек:
program() { printf '%02d-1: %6s 2: %6s 3: %6s' "$i" "$1" "$2" "$3"; }
runa() { program "$@"; }
runb() { program $@ ; }
run1() { echo "`runa "$1" "$2" "$3"`"; }
run2() { echo "`runb "$1" "$2" "$3"`"; }
run3() { echo "`runa $1 $2 $3`"; }
run4() { echo "`runb $1 $2 $3`"; }
for i in `seq 4`; do
run"$i" 'a b' c
done
Затем, при выполнении, мы получаем следующее:
# Any shell (except zsh) results.
01-1: a b 2: c 3:
02-1: a 2: b 3: c
03-1: a 2: b 3: c
04-1: a 2: b 3: c
Только первый прогон (run1), где все заключено в кавычки, сохраняет 'a b '
присоединился.
Однако zsh действует так, как будто все цитируются все время:
# ZSH results.
01-1: a b 2: c 3:
02-1: a b 2: c 3:
03-1: a b 2: c 3:
04-1: a b 2: c 3:
Предполагается, что zsh
будет эмулировать старые оболочки, если они будут называться sh
или ksh
.
Но на практике это не всегда верно:
$ ./sh ./so # emulated sh
01-1: a b 2: c 3:
02-1: a b 2: c 3:
03-1: a 2: b 3: c
04-1: a 2: b 3: c
Вторая строка отличается от второй строки для любой другой оболочки.
Рекомендуется прочитать ответы на этот вопрос