중괄호 확장 : 한 줄로 확장하는 대신 여러 명령을 실행합니까?


11

bash에서 괄호 확장을 사용하면

echo {a,b,c}

된다

echo a b c

대신 확장마다 하나씩 3 개의 개별 명령으로 확장하는 방법이 있습니까?

그래서:

echo {a,b,c}

될 것이다

echo a
echo b
echo c

답변:


12

이것은 단지 "알고 싶어서"질문입니까, 아니면 실제 사용 사례가 있습니까? 우리는 그것을하기 위해 체조를 할 수 있습니다 :

$ eval echo\ {a,b,c}\;
a
b
c

그러나 나는 이런 종류의 난독 한 명령을 우리의 시스템 스크립트에 넣은 사람을 사냥했습니다.

명확성을 위해 왜 대신하지 않습니까?

$ for X in {a,b,c}; do echo $X; done

당신은 심지어 전체 돼지에게 가서 몇 줄을 개설하고 조금 들여 쓰기 할 수 있으므로 항상 당신이하려는 일을 이해할 수 있습니다.


4
@peth-이것이 간단한 예라고 가정합니다. 실제로 목록처럼 간단하다면 옳습니다. 더 비슷한 경우 file-{r,b,g}{m,n,o}{x,y.z}.foo27 개의 값을 모두 열거하는 것보다 짧은 형식을 사용하는 것이 좋습니다.
unpythonic

@peth-좋은 후속 질문이라고 생각했습니다.
unpythonic

나는 이것을 오랫동안 알고 싶었습니다. 감사합니다! :)
Sirex

1
유스 케이스는 둘 이상의 파일을 허용하지 않는 프로그램 (예 : 확장)이 작동하지 않는 프로그램이었습니다. 따라서 프로그램을 여러 번 쉽게 실행할 수 있으면 좋을 것입니다. 이것에 대한 for효과가 있지만, 여전히 더 타이핑하고 있습니다 : P
houbysoft

여러 자식 분기를 정리하는 데 사용했습니다.eval git branch -d \{ branch-a, branch-b }\;
Kit

3

Mark Mann의 선택된 답변을 기반 으로이 예제를 더 도출 할 수 있었으며 이는 훌륭하게 작동합니다.

$ eval echo\ category_{17,32,33}.properties\{,.bak\}\;
category_17.properties category_17.properties.bak
category_32.properties category_32.properties.bak
category_33.properties category_33.properties.bak

표시되는 것은 한 줄에서 여러 번의 중괄호 확장을 사용할 때 Mark의 원래 예제는 모든 변형을 개별적으로 인쇄했을 것입니다. 대신, 그의 대답을 사용하여 여러 파일을 이동 / 이름 바꾸기를 원했습니다. 출력 형식에 일치되도록하여 mv일반적으로 기대를 ( mv oldfilename newfilename), I는이 평가 될 때까지 않을 그래서, 중괄호 확장 번째 발생을 탈출 한 후 초기 eval명령이 실행되었다.

위의 출력이 예상대로 나타나면 다음 명령을 실행할 수있었습니다.

$ eval mv\ category_{17,32,33}.properties\{,.bak\}\;
$ ls
category_17.properties.bak  category_32.properties.bak  category_33.properties.bak

원래 답변에 대해 Mark에게 감사드립니다. 그의 대답이 나에게 허용 된 것을 좋아한다면 그의 대답을 투표하십시오 :-)


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.