“cat {foo}”가 foo를 출력하지 않지만“cat {foo, bar}”가 출력하는 이유는 무엇입니까?


12

하위 폴더에서 텍스트 파일을 연결하려고 시도했지만 시도했습니다.

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

그러나 이것은 아무것도 반환하지 않았습니다. 따라서 존재하지 않는 'subfolder2'를 추가하려고했습니다.

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

그리고 이번에는 파일을 성공적으로 연결하여 문제를 해결했습니다. 왜 이런 일이 발생합니까?


2
어떤 명령 줄을 사용 했는지 echo대신에 사용하십시오 cat. (또는 set -x디버깅에 사용 )
Peter Cordes

답변:


22

정의에 따르면 GNU Bash에서 중괄호 확장에는 시퀀스 표현식 또는 일련의 쉼표로 구분 된 값이 필요합니다.

괄호 확장 패턴은 선택적 프리앰블의 형태를 취한 후 일련의 쉼표로 구분 된 문자열 또는 한 쌍의 괄호 사이의 시퀀스 표현식, 선택적 포스트 스크립트를 따릅니다.

당신은 할 수 있습니다 설명서를 읽어 자세한 내용은.

몇 가지 간단한 샘플 :

echo {subfolder1}
{subfolder1}

echo {subfolder1,subfolder2}
subfolder1 subfolder2

echo subfolder{1}
subfolder{1}

echo subfolder{1..2}
subfolder1 subfolder2


1

중괄호는 {abc, def} 또는 범위 (예 : {a..e}) 사이에 쉼표로 구분 된 문자열이있는 경우에만 확장됩니다.

귀하의 경우 하위 폴더 1을 중괄호로 묶지 않고도 쓸 수 있습니다.

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

불행하게도, /path/{a,}/filename받는 확장 문자열 /path/a/filename/path//filename원치 않는 될 수있다.
Kusalananda

@Kusalananda에게 감사의 말을 전한다. 네 bash는 "모호한 리디렉션"이라는 경고 메시지를 제공 할 것이다
Neo_Returns

아니, 당신은 얻을 ambiguous redirect 당신이 예를 들어, 값이없는 인용되지 않은 변수에 의해 주어진 파일로 리디렉션하려고하면 echo 'hello' >$idontexist.
Kusalananda

1
... 또는 리디렉션의 파일 이름이 여러 단어로 확장되는 경우. > *.txt여러 .txt파일에서 와 같이 또는 공백이있는 > $file경우 $file그러나 물론 cat여러 가지 주장 을 하는 것이 모호한 것은 없습니다
ilkkachu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.