Я понимаю, что расширение фигурной скобки в Bash расширится до нескольких аргументов. У меня может быть он, расширяются до отдельного аргумента?
Существует ли чистое решение этого в Bash, не обращаясь к вложенному эху?
Фактическое поведение
command arg{1,2,3}
$1 = arg1
$2 = arg2
$3 = arg3
Желаемое поведение
$1 = arg1 arg2 arg3
$2 =
$3 =
Нерешение
command "arg{1,2,3}"
$1 = arg{1,2,3}
$2 =
$3 =
Потенциальное решение (немного взлома-y?)
command "$(echo arg{1,2,3})"
$1 = arg1 arg2 arg3
$2 =
$3 =
Расширение arg{1,2,3}
кому: arg1 arg2 arg3
назван Расширением Фигурной скобки, разделение этого в три слова называют Word Splitting и вставкой выходной Замены Команды команды. man bash
говорит:
Порядок расширений: расширение фигурной скобки; расширение тильды, параметр и переменное расширение, арифметическое расширение и замена команды (выполненный слева направо вид); разделение слова; и расширение пути.
В командной строке как
printf %s\\n {1..3}
Расширение фигурной скобки происходит сначала и делает его
printf %s\\n 1 2 3
где 1
, 2
и 3
отдельные слова благодаря Word Splitting. Нет ничего, что можно сделать для изменения этого порядка – когда Вы испытали, заключение в кавычки его не только предотвращает Word Splitting, но Расширение Фигурной скобки также. Можно однако использовать Замену Команды для получения Расширения Фигурной скобки даже в двойных кавычках:
Если [команда] замена появляется в двойных кавычках, разделение слова и расширение пути не выполняются на результатах.
В
printf %s\\n "$(echo {1..3})"
внутренняя из кавычек расширена сначала
printf %s\\n "$(echo 1 2 3)"
printf %s\\n "1 2 3"
и поскольку результат заключается в кавычки, он не подвергается Word Splitting:
$ printf %s\\n {1..3} "{1..3}" "$(echo {1..3})" # prints one argument per line
1
2
3
{1..3}
1 2 3
Это - действительно не только самый простой способ сделать это, но также и чистое bash
решение, как echo
a bash
встроенный.