해시뱅 없이 sudo로 스크립트를 실행하는 쉘 인터프리터는 무엇입니까?

해시뱅 없이 sudo로 스크립트를 실행하는 쉘 인터프리터는 무엇입니까?

이것은 확장입니다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는 이를 로그인 셸 경로로 설정합니다.

shsudo ( 당신을 위해) 에서 실행 중이면 다음을 dash사용하여 직접 볼 수 있습니다 pstree.

$ cat test.sh
pstree $$
$ ./test.sh
bash───pstree
$ sudo ./test.sh
sh───pstree

sh사양의 이 부분은 sudo의 구현 선택을 제한하지 않지만 사용은 POSIX를 준수합니다.

readlink /proc/$$/exedash자세한 내용 도 확인하겠습니다 . 다른 방법을 사용하여 연결한 질문에서 실행 중인 셸을 식별할 수도 있습니다.

대시에는 의미가 없는 단일 달러 기호가 있고 그 뒤에 작은 따옴표 문자열이 있습니다. 기본적으로 기호가 모든 쉘에서 유지되는 것과 같은 방식입니다 $'abc'.foo=$

관련 정보