Это предоставляет одну строку в качестве аргумента для foo
:
foo "${ENV_VAR_1} ${ENV_VAR_2}"
Поскольку $ 1
не в кавычках, оболочка выполняет разделение слов и, следовательно, предоставляет три аргумента для bar
:
bar $1
Разделение слов выполняется для любых символов IFS в S1
. Первоисточник этих персонажей не рассматривается.
Определим x
как:
$ x="${ENV_VAR_1} ${ENV_VAR_2}"
Теперь напечатайте "$ x"
:
$ printf "%s\n" "$x"
1 2 3
Как видите, "$ x "
интерпретируется как один аргумент. Напротив, рассмотрим:
$ printf "%s\n" $x
1
2
3
В приведенном выше разделении слов выполняется $ x
, создавая три аргумента.
Строки оболочки не имеют никакого представления об истории. Строка x
не имеет записи о том, что 2 3
является частью одной строки до того, как было присвоено x
. Строка x
состоит только из 1
, пробела, 2
, пробела и 3
, а разделение слов действует на пробелы.
Это дает результат, который вам нужен:
$ foo() ( IFS=@; bar $1; )
$ foo "${ENV_VAR_1}@${ENV_VAR_2}"
1 test 2 3
В foo
мы устанавливаем IFS
на @
. Следовательно, все последующее разделение слов выполняется с использованием @
в качестве разделителя слов. Итак, при вызове foo
мы помещаем @
в любое место, в котором мы хотим разделить слова.