Почему разделитель не работает для расширения массива?

Я хочу ограничить изменение разделителем только следующей командой echo, а не оболочкой:

$ myarr=(1 2 3) $ echo $( IFS="|"; echo "${myarr[@]}" ) 1 2 3 $ echo $( ( IFS="|"; echo "${myarr[@]}" ) ) 1 2 3 

Почему разделитель не работает для расширения массива? Благодарю.

От POSIX, относительно $* :

Когда расширение происходит в контексте, где разделение полей не будет выполнено, начальные поля должны быть объединены, чтобы сформировать единое поле со значением каждого параметра, разделенного первым символом переменной IFS если IFS содержит хотя бы один символ, или разделяется если IFS не установлен, или без разделения, если для IFS задана нулевая строка.

Чтобы объединить слова с разделителем, вы должны будете использовать $* или ${array[*]} в bash :

 $ set -- word1 word2 word3 "some other thing" word4 $ IFS='|' $ echo "$*" word1|word2|word3|some other thing|word4 

Или с массивом в bash :

 $ arr=( word1 word2 word3 "some other thing" word4 ) $ IFS='|' $ echo "${arr[*]}" word1|word2|word3|some other thing|word4 

С вашим кодом:

 $ myarr=( 1 2 3 ) $ echo $( IFS="|"; echo "${myarr[*]}" ) 1|2|3 

Для сравнения:

 $ myarr=(1 2 3) $ printf '%s\n' $( IFS="|"; echo "${myarr[@]}" ) 1 2 3 $ printf '%s\n' $( ( IFS="|"; echo "${myarr[*]}" ) ) 1|2|3 

От человека Баш:

@
… Когда раскрытие происходит в двойных кавычках, каждый параметр раскрывается в отдельное слово. То есть “$ @” эквивалентно “$ 1” “$ 2”

*
… Когда раскрытие происходит в двойных кавычках, оно расширяется до одного слова со значением каждого параметра, разделенного первым символом специальной переменной IFS . То есть «$ *» эквивалентно «$ 1c $ 2c …» , где c – первый символ значения переменной IFS.

Вышеприведенное описание относится к позиционным параметрам, но также применимо к расширениям массива.