Как узнать, какие команды будут использовать расширение скобки, а что нет?

Например, это работает:

$ curl -s -X GET "http://api-int.abc.com/api/{,,,}ukulele/v1/health"

Это выполняет 4 команды curl, которые я хочу.

Между тем ping не будет использовать расширение скобки:

 $ ping {google,yahoo,microsoft}.com usage: ping [-AaDdfnoQqRrv] [-b boundif] [-c count] [-G sweepmaxsize] 

Но прикосновение будет:

$ touch .temp/{a,b,c}.txt

Создает три файла.

Как я могу узнать из man-страницы для этих команд, которые могут использовать расширение скобки?

Первое, что нужно понять, это то, что некоторые команды допускают несколько аргументов, а некоторые – нет. В то время как touch позволяет несколько аргументов, ping не делает. В случае ping скобки расширяются до нескольких и вызывают ping с несколькими аргументами, которые ping не будет делать. В этом случае лучше всего подходит цикл for. Кроме того, фигурные скобки в curl являются особым случаем (см. Ниже).

Ответ на «какие команды могут использовать расширение брекетов» – это все и ничего. Расширение скобки выполняется оболочкой, прежде чем передавать расширенный вывод в команду. Другими словами, запуск команды совершенно не имеет значения. Расширение foo{bar,baz} до foobar foobaz выполняется оболочкой перед запуском команды и передачей расширенной строки в качестве параметров к ней.

Однако расширение каретки не происходит внутри кавычек. Другими словами, оба "{,,,}" и "{a,b,c}" остаются в виде строк и не расширяются:

 $ echo "{,,,}" {,,,} $ echo "{a,b,c}" {a,b,c} 

Чтобы получить расширение для работы, вы должны удалить цитаты:

 $ echo {,,,} ## this expands to a blank string, so this is what is printed $ echo {a,b,c} abc 

Это задокументировано в соответствующем разделе man bash (акцент мой):

Расширение скобки выполняется перед любыми другими расширениями , и любые символы, особые для других расширений, сохраняются в результате. Это строго текстовое. Bash не применяет синтаксическую интерпретацию контекста расширения или текста между фигурными скобками.

Правильно сформированное расширение скобки должно содержать некотируемые открывающие и закрывающие фигурные скобки и, по меньшей мере, одну некотируемую запятую или правильное выражение последовательности.

Теперь причина, по которой вы запутались, заключается в том, что у curl самом деле есть свой собственный синтаксический анализатор, который также обрабатывает расширение фигурной скобки. Это делается независимо от оболочки и объясняется в man curl :

Вы можете указать несколько URL-адресов или частей URL-адресов, написав наборы деталей в фигурных скобках, как в:

  http://site.{one,two,three}.com 

Таким образом, любая команда может работать с расширением скобки, так как на самом деле это не команда, работающая с ней, а оболочка, которая расширяет выражение в фигурных скобках перед вызовом команды. Curl запутан, потому что он имеет свою собственную аналогичную функцию.