셸에서 중괄호 확장은 어떻게 작동하나요?

셸에서 중괄호 확장은 어떻게 작동하나요?

이 명령은 을 echo {1..3}-{1,2}인쇄합니다 1-1 1-2 2-1 2-2 3-1 3-2. 중괄호가 어떻게 사용되는지 이해합니다. 하지만 실제로는 무엇입니까?그들을?

sh/의 임무는 bash그것들을 구문 분석/확장하고 확장된 버전을 실행 프로그램에 전달하는 것입니까?

그렇다면 그 밖에 무엇을 할 수 있으며 사양이 있습니까?

게다가 이름도 있나요?

ls *.txt인테리어도 비슷한 방식으로 처리되나요?

n번 반복되는 인수를 구현하는 방법이 있나요? 예를 들어 (물론 작동하지 않습니다. 단지 개념일 뿐입니다): cat test.pdf{*3}cat test.pdf test.pdf test.pdf?

답변1

그들이 전화한다버팀대 확장.

bash이는 zsh, 및 에 의해 수행된 여러 확장자 ​​중 하나 이며 ksh, 그 중 파일 이름 확장자 *.txt는 또 다른 것입니다. 중괄호 확장은 POSIX 표준에 포함되지 않으므로 이식성이 없습니다. 이 내용은 다음에서 읽을 수 있습니다.배쉬 매뉴얼.

@Arrow의 제안에 따라 중괄호 확장만 사용하려면 cat test.pdf test.pdf test.pdf다음 "해킹"을 사용해야 합니다.

#cat test.pdf test.pdf
cat test.pdf{,}

#cat test.pdf test.pdf test.pdf
cat test.pdf{,,}

#cat test.pdf test.pdf test.pdf test.pdf
cat test.pdf{,,,}

몇 가지 일반적인 용도:

for index in {1..10}; do
   echo "$index"
done

touch test_file_{a..e}.txt

또는 문자열을 10번 인쇄하는 또 다른 "해킹":

printf -- "mystring\n%0.s" {1..10}

버팀대 확장이 bash완료되었습니다.앞으로매개변수 확장이므로 흔히 저지르는 실수는 다음과 같습니다.

num=10
for index in {1..$num}; do
   echo "$index"
done

( ksh93그러나 쉘은 이 문제를 처리할 수 있습니다)

답변2

페사의 답변답변은 질문의 중요한 측면을 다룹니다. 몇 가지 추가하고 싶은 사항이 있습니다.

별표는 ls *.txt쉘에 의해 처리되므로 쉘 내장 기능을 통해 변경할 수 있는 쉘 옵션에 의해 제어됩니다. 이 경우 를 실행하여 별표 확장을 비활성화 set -f하고 를 실행하여 다시 활성화할 수 있습니다 set +f.

또 다른 점은 스크립트를 이식 가능하게 만들고 싶은 사람은 누구나 POSIX 표준을 확인해야 한다는 것입니다. 예를 들어 {1..9..2}4로 확장되지만 1 3 5 7 9하위 bash버전 bash이나 sh.

관련 정보