echo가 /bin/sh -c echo foo라고 불리며 아무것도 출력하지 않는 이유는 무엇입니까?

echo가 /bin/sh -c echo foo라고 불리며 아무것도 출력하지 않는 이유는 무엇입니까?

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

$ 에코 푸
부자

다음은 수행되지 않습니다.

$ /bin/sh -c 에코 foo

그리고 이것은 사실입니다:

$ /bin/sh -c '에코 foo;에코 바'
부자
술집

설명이 있나요?

답변1

~에서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

$ echo foo
foo

이것은 echo인수와 함께 호출됩니다.부자그리고부자인쇄됩니다.

$ /bin/sh -c echo foo

이것은 인수를 사용하여 쉘을 호출 echo하고 다음을 제공합니다.부자인수로 $0. 새 줄을 출력 echo한 다음 삭제합니다.부자. 출력하고 싶다면부자, 주장을 인용합니다.

sh -c 'echo foo'

또는 제공된 매개변수를 사용하세요.

sh -c 'echo $0' foo

이 예에서는

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

echo foo; echo bar출력 매개변수를 사용하여 셸 호출

foo
bar

답변3

이 명령에서:

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'전체가 "명령 문자열"로 해석됩니다.

답변4

이 구성은 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 에코\ foo
부자
$ /bin/sh -c "에코 foo"
부자
$ /bin/sh -c '에코 foo'
부자

결론적으로

실행된 명령을 "단어"로 유지하려면 따옴표를 사용하세요.

관련 정보