echo가 / bin / sh -c echo foo로 호출되지 않는 이유는 무엇입니까?


15

예를 들어, 이것이 작동하는 동안 :

$ 에코 푸
푸

이것은하지 않습니다 :

$ / bin / sh -c 에코 foo

반면에 :

$ / bin / sh -c '에코 foo; 에코 바
푸
바

설명이 있습니까?

답변:


21

에서 man sh

-c string   If the -c option is present, then commands are read from string. 
            If there are arguments after the string, they are assigned to the
            positional parameters, starting with $0

그것은 당신의 명령이 다음과 같아야 함을 의미합니다.

 $ sh -c 'echo "$0"' foo 
 foo

비슷하게:

$ sh -c 'echo "$0 $1"' foo bar
foo bar

그것은 가장 먼저 이해해야 할 부분이었습니다. 두 번째 경우는 간단하며 설명이 필요하지 않습니다.


2
엄격한 표준 준수의 방법이 될 것이다sh -c 'echo $1' echo foo
jlliagre

1
sh -c 'echo "$@"' fnord a b c d ...
zwol

3
이럴 설명은 아주 좋았지 만, sh -c 'echo $0' foo질문자가 이미 알고있는 것을 고려하여, 최고의 옵션이 아닙니다 /bin/sh -c 'echo foo; echo bar'당신은 단순히 명령 인용 대답 할 수있는 작업을 시작/bin/sh -c 'echo foo'
X3MBoy

1
@ X3MBoy 질문자는 이미 / bin / sh -c 'echo foo'가 제대로 작동한다는 것을 알고 있습니다. 그는 내가 설명, 에코 뭔가 외부로 원
Ijaz 아마드 칸을

18
$ echo foo
foo

echo인수 foo 와 함께 호출 하면 foo 가 인쇄됩니다.

$ /bin/sh -c echo foo

이것은 인수 echo와 함께 쉘을 호출하고 인수로 foo 를 제공합니다 $0. 는 echo새로운 라인을 출력하고 당신은 폐기 foo는 . foo 를 출력 하려면 인수를 인용하십시오.

sh -c 'echo foo'

또는 제공된 인수를 사용하십시오.

sh -c 'echo $0' foo

이 예에서

$ /bin/sh -c 'echo foo; echo bar'
foo
bar

쉘은 echo foo; echo bar출력 하는 인수와 함께 호출됩니다.

foo
bar

8

이 명령에서 :

echo foo

echo이진 (또는 내장 명령)이며 foo첫 번째 인수입니다.

여기:

/bin/sh -c echo foo

/bin/sh이진은 첫 번째 인수는 -c"명령 문자열"을 매개 변수로 사용합니다. 이다 echo위의 예. : 그럼 세 번째 인수가 foo에 대한 인수입니다 /bin/sh하지 않는가 echo. 이것이 세 번째 예의 이유입니다.

/bin/sh -c 'echo foo; echo bar'

... 모두 인쇄됩니다. 당신은 논쟁을 인용했습니다. 따라서 첫 번째 인수는이며이 인수 -c의 매개 변수 'echo foo; echo bar'는 전체를 하나의 인수로 해석합니다. "명령 문자열"로.


3

구조 sh -c word는 단어 (쉘에서) 만 실행합니다.
추가 된 단어는 인수 0, 1, 2 등과 같은 다른 것을 의미합니다.

sh -c word zero one two three

공백이 하나의 단어로 된 명령을 유지하려면 인용이 필요합니다.

sh -c 'echo fnord' zero one two three

따라서 모든 인수를 인쇄합니다.

$ sh -c 'echo "args=" "$0" "$@"' zero one two three
args = zero one two three

제시 한 예에서 : /bin/sh -c echo foo첫 번째 단어 (옵션 후) echo는 바로 그 단어 입니다. 그리고 텍스트가없는 에코는 개행 만 인쇄하며 다른 것은 없습니다.

$ / bin / sh -c 에코 foo

그래서 빈 줄이 생깁니다.

공백을 인용하면 다음과 같이 "한 단어"(공백 없음)가 실행됩니다.

$ / bin / sh -c echo \ foo
푸
$ / bin / sh -c "에코 푸"
푸
$ / bin / sh -c '에코 푸'
푸

결론

인용 부호를 사용하여 실행 된 명령을 "단어"로 유지하십시오.

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