"bash script.sh" 대 "sh script.sh" wrt Kill 명령 - 여기서 sh는 bash에 심볼릭 링크됩니다.

"bash script.sh" 대 "sh script.sh" wrt Kill 명령 - 여기서 sh는 bash에 심볼릭 링크됩니다.

달리는 것의 차이점은 무엇입니까?세게 때리다bash명령 자체와 sh명령 해석기를 사용하면 shbash에 대한 심볼릭 링크는 어디에 있습니까?

내가 찾은 주요 차이점은 kill명령이 신호 이름을 허용하지 않고 신호 번호 만 허용한다는 sh것 입니다.shkill

그러나 shvs bashrun 에서 kill명령은 모두 쉘 내장 명령입니다. 호출이 사용되면 bash는 다르게 동작하는 것 같습니다 sh.

이 동작에 대한 문서가 있습니까?


자세한 내용은 아래를 참조하세요.

스크립트 파일

#!/bin/bash

some_bg_program()
{
    sleep 10
}

some_bg_program&
pid=$!
kill -SIGTERM $pid

bash script.sh다음으로 실행 한 결과 및sh script.sh

user@machine/tmp$ sh script.sh
script.sh: line 8: kill: SIGTERM: invalid signal specification
user@machine/tmp$ bash script.sh

(bash script.sh는 성공적으로 실행되며 오류가 발생하지 않습니다.)

bash정보 및 명령 sh:

user@machine/tmp$ which bash
/usr/bin/bash

user@machine/tmp$ which sh
/usr/bin/sh

user@machine/tmp$ ls -l /usr/bin/sh
lrwxrwxrwx. 1 root root 4 Aug  4  2020 /usr/bin/sh -> bash        # You can see the symlink here

user@machine~>ls -l /usr/bin/bash
-rwxr-xr-x. 1 root root 964608 Oct 30  2018 /usr/bin/bash

user@machine/tmp$ type sh
sh is hashed (/usr/bin/sh)
user@machine/tmp$ type bash
bash is hashed (/usr/bin/bash)

killBash/sh의 명령에 대한 정보

user@machine/tmp$ cat script.sh
#!/bin/bash
which kill
type kill

user@machine/tmp$ sh script.sh
/usr/bin/kill
kill is a shell builtin

[email protected]/tmp>bash script.sh
/usr/bin/kill
kill is a shell builtin

kill두 경우 모두 내장 쉘 입니다.

마지막으로 bash 메시지는 다음과 같습니다.

$ bash --version
GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)
$ sh --version
GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)

감사해요

답변1

bash쉘이 name 으로 시작 되면 마치 이 옵션으로 시작된 sh것처럼 POSIX 모드에서 자동으로 실행됩니다 .--posix

이 설명서의 "참조" 섹션은 bash다음을 참조합니다.http://tiswww.case.edu/~chet/bash/POSIX쉘의 POSIX 모드에 대한 설명입니다. 이 페이지는 kill내장 유틸리티 사용 시 발생한 문제와 관련하여 다음을 보여줍니다.

다음 목록은 "POSIX 모드"가 적용될 때 변경되는 사항입니다.

[...]

  1. 'kill' 내장 함수는 'SIG'라는 접두사가 붙은 신호 이름을 허용하지 않습니다.

그렇습니다. kill내장 유틸리티는 SIGPOSIX 모드에서 접두사가 붙은 신호 이름을 허용하지 않습니다. 접두사 없이 신호 이름을 사용할 수 있습니다 SIG.

kill -INT "$pid"

또는

kill -s INT "$pid"

이것도 방법이다kill이 유틸리티에 대한 POSIX 사양사용해야 한다고 합니다.

이 신호는 전송된 기본 신호와 동일합니다 kill -TERM "$pid".kill "$pid"TERMkill

0신호 번호 는 기억하기 어렵고 짧은 목록을 제외하면 Unices마다 다르기 때문에 신호 번호(신호 제외)를 사용하지 않겠습니다 .

관련 정보