Відповіді:
Здається, bash не використовує $ IFS для приєднання створених слів. Іншою технікою було б зберігання згенерованих слів у масиві, і тоді $ IFS буде в грі:
Я буду використовувати нижню частину оболонки, щоб не змінювати IFS цієї оболонки: виберіть один із
( words=( a{b,c,d} ); IFS=,; echo "${words[*]}" )
( set -- a{b,c,d}; IFS=,; echo "$*" )
Це випромінює рядок, що розділяє кому до stdout. Якщо ви хочете зробити це:
joined=$( set -- a{b,c,d}; IFS=,; echo "$*" )
Я впевнений, що існує багато способів досягти цього. Ось один метод:
echo a{b,c,d} | sed 's/ /,/g'
Розгорніть такі елементи, як ви показали, а потім переведіть їх на петлю, додавши коску до всіх, крім першої ітерації:
for i in a{b,c,d}; do
u="${u:+$u, }$i"
done
echo "$u"
Результат:
ab, ac, ad
Див. Підстановку параметрів bash .
Ось єдине рішення.
(IN=$(echo a{b,c,d}); echo ${IN// /,})
# ab,ac,ad
Частина перед крапкою з комою присвоюється ab ac ad
змінній, IN
а друга частина використовує пошук і заміну для зміни всіх пробілів до коми. //
Чи означає , що всі матчі, а не тільки перший.
Зробіть це все в підзаголовку (що додаються в дужки), щоб не забруднити простір імен.
Варто зазначити, що в багатьох контекстах у такому списку є прийнятна кома в кінці. ЯКЩО кінцева кома прийнятна, найпростіший спосіб вчинити із заміною printf
:
some-command "$(printf %s, a{b,c,d} )"
(Де some-command
команда, яка працює у списку, розділеному комами, і не піклується про те, що йде через кому.)
Насправді, навіть якщо у вас не повинно бути кінцевої коми, яку ви можете використовувати printf
; вам просто потрібно вказати кількість очікуваних аргументів, що робить його незграбним для дуже довгих списків:
some-command "$(printf %s,%s,%s a{b,c,d} )"