중괄호 확장을 사용하는 명령과 사용하지 않는 명령을 어떻게 알 수 있나요?

중괄호 확장을 사용하는 명령과 사용하지 않는 명령을 어떻게 알 수 있나요?

예를 들어 다음과 같이 작동합니다.

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

이것은 정확히 내가 원하는 4개의 컬 명령을 실행합니다.

또한 ping중괄호 확장은 사용되지 않습니다.

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

하지만 만지면 다음과 같은 결과가 발생합니다.

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

세 개의 파일을 만듭니다.

이러한 명령의 매뉴얼 페이지에서 어떤 명령이 중괄호 확장을 사용할 수 있는지 어떻게 알 수 있습니까?

답변1

가장 먼저 이해해야 할 점은 일부 명령은 여러 매개변수를 허용하지만 일부 명령은 허용하지 않는다는 것입니다. touch여러 매개변수가 허용되지만 이는 허용 ping되지 않습니다. ping괄호가 여러 개로 확장되고 여러 인수로 ping을 호출하는 경우에는 ping작동하지 않습니다. 이 경우 for 루프가 더 나은 솔루션입니다. 또한 안의 괄호는 curl특별한 경우입니다(아래 참조).

"중괄호 확장이 가능한 명령"에 대한 대답은 전부 아니면 전무입니다. 중괄호 확장은 확장된 출력을 명령에 전달하기 전에 쉘에 의해 수행됩니다. 즉, 실행되는 명령은 전혀 관련이 없습니다. foo{bar,baz}to의 확장은 foobar foobaz명령을 시작하고 확장된 문자열을 인수로 전달하기 전에 쉘에 의해 수행됩니다.

그러나 따옴표 안에서는 중괄호 확장이 발생하지 않습니다. 즉, and 는 "{,,,}"둘 다 "{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}
a b c

이는 man bash관련 섹션(강조 항목)에 문서화되어 있습니다.

중괄호 확장은 다른 확장보다 먼저 수행됩니다., 다른 확장명에 고유한 문자는 모두 결과에 유지됩니다. 엄격하게 텍스트입니다. Bash는 확장된 컨텍스트나 중괄호 사이의 텍스트에 구문 해석을 적용하지 않습니다.

올바르게 구성된 중괄호 확장에는 인용되지 않은 열기 및 닫는 중괄호가 포함되어야 합니다., 그리고 따옴표가 없는 하나 이상의 쉼표 또는 유효한 시퀀스 표현.

이제 혼란스러운 이유는 curl실제로 자체 파서가 있고 중괄호 확장도 처리하기 때문입니다. 이는 쉘과 독립적으로 수행되며 다음에서 설명됩니다 man curl.

다음과 같이 중괄호 안에 부분 집합을 작성하여 여러 URL 또는 URL의 일부를 지정할 수 있습니다.

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

따라서 실제로 이를 사용하는 명령이 아니라 명령을 호출하기 전에 중괄호 안의 표현식을 확장하는 셸이기 때문에 모든 명령은 중괄호 확장을 사용할 수 있습니다. Curl은 비슷한 기능을 가지고 있기 때문에 혼란스럽습니다.

관련 정보