2014-09-23 5 views
1

명령의 각 반복마다 특정 매개 변수를 조정하여 중괄호 확장 (또는 다른 간단한 방법)을 사용하여 셸 명령을 반복 할 수 있습니까? 여기에 내가하고 싶은 간단한 예제가있다. (더 긴 명령을 사용한다.) cp a b; cp a c;중괄호 확장 명령이 인식되지 않습니다.

분명히, 터미널에 입력하면 작동합니다. 그러나 나는 그것을 더 조밀 한 방법으로 생성 할 수 있기를 원합니다. bash 중괄호 확장을 사용하려고했지만 오류가없는 명령을 제공합니다.

~/test $ ls 
a 
~/test $ cp\ a\ {b,c}\; 
cp a b;: command not found 
~/test $ 

백틱 사용은 작동하지 않습니다. - 그렇지 않으면 filename with a space라는 이름의 파일이 별도의 네 가지로 변환됩니다

for arg in b c; do cp a "$arg"; done 

따옴표가 중요하다 : 당신이 원하는만큼 정확하고 안전한 방식으로 이렇게

~/test $ `cp\ a\ {b,c}\;` 
cp a b;: command not found 
+1

당신은'cp a b;'의 단일 문자열을 만들고 있습니다. 그것은 명령이 아닙니다. 그것은 문자열입니다. "cp a b;"라고 입력 해보십시오. 당신의 껍질에 무엇이 일어 났는지 보아라. 'eval'없이 여기서하려는 일을 할 수 없습니다.'echo b c | xargs cp a'는 여기서하려고하는 일을해야하지만 실제 상황이 무엇인지 모른 채 더 나은 해결책을 제공 할 수는 없습니다. –

+1

@etan 좋은 조언. 좀 더 명확한 방법은'for f in b c; cp a $ f 할; done'이지만, 그건 스타일의 문제 일뿐입니다. –

+0

'eval cp \ a \ {b, c} \;'가 작동하는 것처럼 보입니다. 백틱과 $()의 차이점은 무엇입니까? – mike

답변

1

로 간결하지 않습니다 인수들, filename, with, aspace. (글자 그대로 bc 만 처리한다면 그건 문제가되지 않지만 뜨거운 물에 나중에 들어올 수있는 습관을 세우는 것은 좋은 습관이 아닙니다.


귀하의 질문과 의견 멋 부리다 중괄호 확장의 결과를 처리 할 eval의 사용,하지만 다소 악 :

eval "cp a "{b,c}";" 

이 가진 문제는 아주 간단한 매개 변수와 함께 잘 작동하는 동안 (쉘 구문을 포함하는 파일 이름, 특히) 너무 단순하지 않은 인수를 사용하여 예기치 않게 예상치 못한 방식으로 작동합니다. 따라서 극도로 빈약 한 습관입니다. 역 따옴표에 대하여


- 또한 cp의 표준 출력로부터 판독하는 것을 제외

`cp a b c` 

는 ... 정확히 대체품

cp a b c 

와 동일 출력 결과에 cp를 출력 한 다음 해당 명령도 실행합니다.

그래서,

echo `cp a b c` 

처음 실행 cp a b c는 출력 읽기 - 오류가있다하더라도, 그것은하지 표준 출력, 표준 오류에 기록이기 때문에, 비어, 다음 실행

echo 

... 인수가 없습니다. cp 을 stdout으로 내보내는 경우 해당 문자열은 인수로 구문 분석되며 인수는 echo으로 전달됩니다.

+0

귀하의 광범위한 설명에 감사드립니다. 매우 도움이됩니다. 내가 원하는만큼 콤팩트하지는 않지만 작동합니다. – mike

+0

그러나 백틱이 작동하지 않는 이유는 아직도 이해할 수 없습니다. 당신의 설명 (그리고 중괄호 확장을 먼저한다고 가정)에서,'\'cp \ a \ {b, c} \; \''(backticks와 함께)는'cp a b; a (확장 및 backticks없이) 그리고 나서, 아무데도 그것을 대체 할 수 없기 때문에 아무것도하지 않겠습니까? 그러나 대신, 그것은 나에게 오류를 준다. 아마 bash는 backticks에서 중괄호 확장을하지 않습니까? – mike

+0

또한, 그런데, 나는'cp a b; cp a c;''cp a b c' '를 사용하십시오. 당신이 그것을 의도적으로 바꿨는지 확실하지 않습니다. – mike

관련 문제