저는 매개변수 확장을 가지고 놀았습니다. 아래는 내 코드입니다.
a="one"
sh -c 'echo $a'
b="two"
sh -c "echo $b"
c="three" sh -c 'echo $c'
echo $c
이 스크립트를 실행할 때의 출력은 다음과 같습니다.
$sh test.sh
two
three
$
$a의 경우 작은따옴표는 대체를 억제합니다. 그냥 echo $a 를 출력하면 안되나요? 새 줄을 인쇄하고 있는데, 이는 $a 값이 비어 있다는 뜻인가요? $c의 경우 "echo $c"가 작동하지 않고 새 줄이 인쇄되지 않지만 다음 줄의 echo $c는 예상대로 작동합니다. 이것이 어떻게 작동하는지 조금 혼란 스럽습니다.
답변1
sh -c 'echo $a'
이는 새 셸을 열고 echo $a
입력하는 것과 같습니다. 하위 셸에는 변수가 없으므로 a
(상위 셸에서 변수를 설정하지 않았음 export
) 빈 줄이 인쇄됩니다.
그리고
b="two"
sh -c "echo $b"
, "echo $b"
문자열은 현재 쉘에 의해 확장되고 확장된 값은 매개변수 문자열로 하위 쉘에 전달됩니다. 마치 새 쉘을 열고 echo two
.
var=val command
임시로 설정하고 export
s를 var=val
호출하면 됩니다 command
.
c="three" sh -c 'echo $c'
거의 (하위 쉘은 실제로 존재하지 않습니다)
( export c="three"; sh -c 'echo $c' )
상위 쉘의 c 변수는 영향을 받지 않습니다.
답변2
하위 프로세스의 변수를 보려면 export
해당 변수를 확인해야 합니다. 이와 같이:
$ export a=7
$ sh -c 'echo $a'
7
귀하의 경우 하위 프로세스( a
및 b
)는 상위 셸의 변수를 볼 수 없습니다.
작은따옴표를 사용하여 문자열을 생성하면 어떤 대체도 작동하지 않습니다. 변수나 그와 유사한 것은 대체할 수 없습니다 \n
. 그것은 정확히 $a
또는 가 될 것입니다 \n
. 따라서 첫 번째 경우의 문자열은 정확히 "echo $a"입니다. sh -c 'echo $a'
만들 것이다새로운프로세스이며 프로세스에는 상위 프로세스가 없으며 빈 문자열인 $a
자체 uninitialized 가 있습니다 . $a
그것은 단지 실행될 것입니다'echo $a'
두 번째 경우에는 큰따옴표를 사용합니다. 교체가 작동하고 문자열은 다음과 같습니다."echo two"
앞으로자식 프로세스를 실행합니다. 그래서, 그것은 단지 실행입니다 sh -c 'echo two'
.
세 번째 경우에는 $c
내보낸 변수가 됩니다. 이는 "이 명령에 대해서만 변수 내보내기"를 의미하는 특수 구문입니다. 따라서 정확하게 실행하면 새 쉘이 환경 변수로 sh -c 'echo $c'
포함됩니다 . 또는 쉘을 시작할 때 와 $c
같습니다 .$PATH
$HOME