시스템은 shebang 줄 없이 스크립트를 실행할 쉘을 어떻게 결정합니까? [복사]

시스템은 shebang 줄 없이 스크립트를 실행할 쉘을 어떻게 결정합니까? [복사]

내 Arch Linux 시스템에는 다음 "스크립트"가 있습니다.

$ cat ~/scripts/foo.sh
ps -hp $$

ps자체 PID에서만 실행 됩니다 . 하지만 스크립트에는 shebang 줄이 없습니다. 나는 특정 셔뱅이 없으면 시스템이 내가 실행하는 데 사용한 대화형 셸이나 $SHELL. 불일치하지 않았습니다.

  1. bash 세션에서 시작하면 bash에 의해 실행됩니다.

    $ ps -hp $$ 
    1267979 pts/15   Ss     0:00 /bin/bash
    $ foo.sh
    1276346 pts/15   00:00:00 bash
    
  2. 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
    
  3. 세션에서 시작하면 sh다시 실행됩니다 sh.

    $ ps -hp $$
    1281052 pts/15   S      0:00 sh
    $ foo.sh
    1281296 pts/15   S+     0:00 sh
    
  4. 세션에서 시작하면 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
    
  5. 세션에서 시작하면 다시 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/shbash인지 다른 쉘 인지와는 아무런 관련이 없습니다 . 또한 동일한 동작을 /bin/sh갖는 Ubuntu 시스템에서 테스트했습니다 . bash는 자체적으로 스크립트를 실행 하고 .bashrc를 사용하여 스크립트를 실행합니다 .dashdashzshsh

위에서 언급한 내 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. 여기서 무슨 일이 일어나고 있는 걸까요? 나는 이것들이 모두 동일하다는 것을 알고 있지만 동일한 기본 작업을 시작하는 방법이 너무 다양하다는 것은 놀랍습니다.

관련 정보