私の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
。ここで何が起こっているのでしょうか?私はこれらすべてが同じであることを知っていますが、同じ基本的な作業を始める方法が多すぎるということは驚くべきことです。