Bash 如何获得支架扩展的备用分隔符?

Bash 如何获得支架扩展的备用分隔符?,bash,Bash,我发现自己经常做一些愚蠢的事情,比如: cmd $( echo foo{1,2,3} | tr ' ' , ) 当我想调用cmd foo1、foo2、foo3时。相反,我希望能够做到以下几点: OFS=;cmd foo{1,2,3} 强制大括号展开以给我一个逗号分隔的列表。有这样的功能吗?我认为用一个简单的变量或设置是不可能的 但是,您可以捕获阵列中的大括号展开,然后使用IFS和参数替换来实现该效果: $ ( a=( foo{1,2,3} ); IFS=,; printf -- "%s\n"

我发现自己经常做一些愚蠢的事情,比如:

cmd $( echo foo{1,2,3} | tr ' ' , )
当我想调用
cmd foo1、foo2、foo3
时。相反,我希望能够做到以下几点:

OFS=;cmd foo{1,2,3}


强制大括号展开以给我一个逗号分隔的列表。有这样的功能吗?

我认为用一个简单的变量或设置是不可能的

但是,您可以捕获阵列中的大括号展开,然后使用IFS和参数替换来实现该效果:

$ ( a=( foo{1,2,3} ); IFS=,; printf -- "%s\n" "${a[*]}" )
foo1,foo2,foo3
在这里,我使用了一个子shell,所以我不会改变当前shell中的IFS


这是一个简短的例子 更整洁的功能:

$ join() { local IFS=$1; shift; printf -- "%s\n" "$*"; }
$ join , foo{1,2,3}
foo1,foo2,foo3

您可以创建一个函数,该函数将回显其参数的逗号分隔列表:

commas() { local IFS=,; echo "$*"; }
然后您可以在调用
cmd
时使用它:

cmd "$(commas foo{1,2,3})"
编辑:请注意,
echo
有些错误,因为如果您传递一个看起来像有效的
echo
选项的参数(例如,
-e
-n
,等等),
echo
将使用它并将其解释为选项,而不是打印它

$ commas -e #prints nothing
$ commas -n #prints nothing
$ commas -e -n
-e,-n
最后一个有效,因为
“$*”
扩展为
-e,-n
,而
echo
将其视为单个参数


echo
不像
printf
那样,将
--
参数作为“选项结束”指示符。因此,您可能希望使用
printf--“%s\n”$*“
,如@glennjackman的答案所示。同样,
commas
函数的全部要点是将多个参数组合成一个逗号分隔的列表,作为一个字符串。因此,您不太可能在
echo
中遇到任何问题。但是,键入
printf--“%s”
而不是
echo

只需多输入几个字符,如果
cmd
总是相同的话,函数可能会有所帮助。有趣的是,大括号扩展和路径名扩展(大括号扩展与之相比)的文档实际上都没有说明结果是什么。它只是一个单词的“列表”,据我所知,最接近的是数组的笨拙使用
cmd“$(IFS=,;x=(foo{1,2,3});printf'%s'${x[*]}”)”
。无引号的命令替换可能会导致问题,具体取决于
commas
的参数最终是什么。谢谢。@chepner发现得很好。谢谢