이것은 확장입니다Shebang 없이 스크립트를 실행하는 쉘 인터프리터는 무엇입니까?
사용 중인 인터프리터에 대한 이해도를 테스트하고 있는데 해시뱅 없이 sudo로 스크립트를 실행할 때 이상한 동작을 발견했습니다.
스크립트는 다음과 같습니다.
echo "I am running shell $SHELL"
foo=$'dollar'
echo "run with sudo to see the magic dollar sign <$foo>"
일반 사용자로 이 스크립트를 실행하면 모든 것이 잘 작동하고 결과는 다음과 같습니다.
I am running shell /bin/bash run with sudo to see the magic dollar sign <dollar>
하지만 sudo를 사용하여 실행하면 출력이 표시됩니다.
I am running shell /bin/bash run with sudo to see the magic dollar sign <$dollar>
따라서 sudo가 없으면 foo는 "dollar"로 확장되지만 sudo를 사용하면 $'' 평가가 무시되고 "$dollar"가 됩니다.
또한 $''는 POSIX와 호환되지 않으므로 bash 외부에서 스크립트를 실행하면 반드시 작동하지 않는다는 것도 이해합니다. sudo bash myscript.sh
예상된 "USD" 출력이 반환되었는지 확인합니다 .
그러나 이러한 시나리오에서 $SHELL은 스크립트가 bash에서 실행되고 있음을 의미합니다. 무슨 일이야?
추신 - 내 /bin/sh는 대시에 연결되어 있습니다. - 이것이 이것과 관련이 있다고 가정할 수 있습니다.
답변1
$SHELL
어떤 쉘이 실행 중인지 알려주는 것이 아니라 SHELL
환경 변수가 무엇인지 알려줍니다. 아직 설정하지 않은 경우 Bash는 이를 로그인 셸 경로로 설정합니다.
sh
sudo ( 당신을 위해) 에서 실행 중이면 다음을 dash
사용하여 직접 볼 수 있습니다 pstree
.
$ cat test.sh
pstree $$
$ ./test.sh
bash───pstree
$ sudo ./test.sh
sh───pstree
sh
사양의 이 부분은 sudo의 구현 선택을 제한하지 않지만 사용은 POSIX를 준수합니다.
readlink /proc/$$/exe
dash
자세한 내용 도 확인하겠습니다 . 다른 방법을 사용하여 연결한 질문에서 실행 중인 셸을 식별할 수도 있습니다.
대시에는 의미가 없는 단일 달러 기호가 있고 그 뒤에 작은 따옴표 문자열이 있습니다. 기본적으로 기호가 모든 쉘에서 유지되는 것과 같은 방식입니다 $'abc'
.foo=$