내 Arch Linux 시스템에는 다음 "스크립트"가 있습니다.
$ cat ~/scripts/foo.sh
ps -hp $$
ps
자체 PID에서만 실행 됩니다 . 하지만 스크립트에는 shebang 줄이 없습니다. 나는 특정 셔뱅이 없으면 시스템이 내가 실행하는 데 사용한 대화형 셸이나 $SHELL
. 불일치하지 않았습니다.
bash 세션에서 시작하면 bash에 의해 실행됩니다.
$ ps -hp $$ 1267979 pts/15 Ss 0:00 /bin/bash $ foo.sh 1276346 pts/15 00:00:00 bash
zsh 세션에서 시작하면 다음과 같이 실행됩니다
sh
(bash
내 시스템에서).% ps -hp $$ 1279855 pts/15 S 0:00 zsh % foo.sh 1280006 pts/15 S+ 0:00 sh /home/terdon/scripts/foo.sh
세션에서 시작하면
sh
다시 실행됩니다sh
.$ ps -hp $$ 1281052 pts/15 S 0:00 sh $ foo.sh 1281296 pts/15 S+ 0:00 sh
세션에서 시작하면
tcsh
다시 실행됩니다sh
.> ps -hp $$ 1281968 pts/15 S 0:00 -csh > foo.sh 1282148 pts/15 S+ 0:00 /bin/sh /home/terdon/scripts/foo.sh
세션에서 시작하면 다시
dash
실행됩니다 .sh
$ ps -hp $$ 1282803 pts/15 S 0:00 dash $ foo.sh 1283404 pts/15 S+ 0:00 /bin/sh /home/terdon/scripts/foo.sh
따라서 bash 세션에서 스크립트가 시작되면 bash는 스크립트를 실행하는 데 자체적으로 사용되는 유일한 셸인 것처럼 보이며, 제가 테스트한 다른 모든 셸에서는 이를 사용합니다 sh
. 이는 /bin/sh
쉘 bash
인지 다른 쉘 인지와는 아무런 관련이 없습니다 . 또한 동일한 동작을 /bin/sh
갖는 Ubuntu 시스템에서 테스트했습니다 . bash는 자체적으로 스크립트를 실행 하고 .bashrc를 사용하여 스크립트를 실행합니다 .dash
dash
zsh
sh
위에서 언급한 내 Arch 및 Ubuntu 시스템에서 내 SHELL
변수는 로 설정 /bin/bash
되고 내 사용자 항목은 내 기본 셸로 설정 /etc/passwd
되었습니다 ./bin/bash
질문:
- 누가 이것을 통제합니까? 커널인가, 쉘인가? 이것은 bash 기능입니까(즉, bash는 shebang 없이 자체적으로 사용됩니다)? 다른 건 없나요?
- 조개껍질은 왜 다르게 행동하나요? 내 출력이 왜 이렇게 다양한 형식으로 나오나요
ps
?sh /home/terdon/scripts/foo.sh
, 외로움sh
, 그리고/bin/sh /home/terdon/scripts/foo.sh
. 여기서 무슨 일이 일어나고 있는 걸까요? 나는 이것들이 모두 동일하다는 것을 알고 있지만 동일한 기본 작업을 시작하는 방법이 너무 다양하다는 것은 놀랍습니다.