Поместите свою всю команду, включая &
, в круглых скобках:
(быстрый) $
gvim 1 &
[3] 9584
(быстрый) $ некоторая другая команда
[3] Done gvimBackground 1
(быстрый) $(gvim 1 &
)
<– (тишина)
(быстрый) $
Вы также можете использовать диапазоны с символами:
Это особенно полезно, если вам нужен больший диапазон.[112442]
Я собираюсь использовать подоболочку, чтобы не изменять IFS оболочки: выберите одну из
, которая испускает строку с разделителями запятых в stdout. Если вы хотите перехватить ее:
Вот решение только для 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} )"
Разверните элементы, как вы показали, а затем прокрутите их, добавив запятую ко всем итерациям, кроме первой:
for i in a{b,c,d}; do
u="${u:+$u, }$i"
done
echo "$u"
Результат:
ab, ac, ad