"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ごとに異なるため、シグナル番号(信号を除く)を使用しません。

おすすめ記事