"cat {foo}"는 foo를 출력하지 않지만 "cat {foo,bar}"는 왜 출력됩니까?

"cat {foo}"는 foo를 출력하지 않지만 "cat {foo,bar}"는 왜 출력됩니까?

하위 폴더에 있는 텍스트 파일을 연결하려고 시도 중입니다.

cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1}/book.txt > out$var

그러나 이것은 아무것도 반환하지 않습니다. 따라서 존재하지 않는 "subfolder2"를 추가해 보십시오.

cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1,subfolder2}/book.txt > out$var

이번에는 작동했고 파일이 성공적으로 연결되었습니다. 왜 이런 일이 발생합니까?

답변1

정의에 따라 GNU Bash의 중괄호 확장에는 시퀀스 표현식이나 쉼표로 구분된 값 목록이 필요합니다.

중괄호를 확장하는 패턴은 선택적 서문, 그 뒤에 일련의 쉼표로 구분된 문자열 또는 한 쌍의 중괄호 사이의 시퀀스 표현식, 그 뒤에 선택적 포스트스크립트의 형태를 취합니다.

당신은 할 수설명서를 읽어보세요더 알아보기.

몇 가지 간단한 예:

echo {subfolder1}
{subfolder1}

echo {subfolder1,subfolder2}
subfolder1 subfolder2

echo subfolder{1}
subfolder{1}

echo subfolder{1..2}
subfolder1 subfolder2

답변2

{subfolder1}{subfolder1}다른 선택지가 없기 때문에 로 평가됩니다 . 대신 사용하십시오 subfolder1.

답변3

중괄호는 {abc,def}와 같이 쉼표로 구분된 문자열이나 {a..e}와 같은 범위가 그 사이에 지정된 경우에만 확장됩니다.

귀하의 경우에는 이렇게 할 필요가 없으므로 중괄호로 묶지 않고 subfolder1 을 작성할 수 있습니다.

cat ./{mainfolder1,mainfolder2,mainfolder3}/subfolder1/book.txt > out$var

관련 정보