예를 들어, 이것이 작동하는 동안:
$ 에코 푸 부자
다음은 수행되지 않습니다.
$ /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' 부자
결론적으로
실행된 명령을 "단어"로 유지하려면 따옴표를 사용하세요.