「ps ax」が「#!」なしで実行中のbashスクリプトヘッダーが見つからないのはなぜですか?

「ps ax」が「#!」なしで実行中のbashスクリプトヘッダーが見つからないのはなぜですか?

このスクリプトを実行すると、終了するまで実行されます。

# foo.sh

while true; do sleep 1; done

...次を使用して見つかりませんps ax

>./foo.sh

// In a separate shell:
>ps ax | grep foo.sh
21110 pts/3    S+     0:00 grep --color=auto foo.sh

#!...しかし、スクリプトに一般的な""ヘッダーを追加すると...

#! /usr/bin/bash
# foo.sh

while true; do sleep 1; done

...このスクリプトは同じコマンドで見つけることができますps

>./foo.sh

// In a separate shell:
>ps ax | grep foo.sh
21319 pts/43   S+     0:00 /usr/bin/bash ./foo.sh
21324 pts/3    S+     0:00 grep --color=auto foo.sh

なぜですか?
これは関連する質問かもしれません。私の考えでは、" "#は単にコメントのプレフィックス#! /usr/bin/bashにすぎません。しかし、#!" "は単なるコメントよりも重要な意味を持っていますか?

ベストアンサー1

このスクリプトは現在インタラクティブシェルを持ち、-lineなしでスクリプトを実行すると実行されbashます。プロセスは出力にと表示されます。#!bashps axbash

$ cat foo.sh
# foo.sh

echo "$BASHPID"
while true; do sleep 1; done

$ ./foo.sh
55411

他の端末から:

$ ps -p 55411
  PID TT  STAT       TIME COMMAND
55411 p2  SN+     0:00.07 bash

関連:


マニュアルの関連部分は次のとおりですbash

ファイルが実行可能な形式ではないか、ディレクトリでないために実行に失敗した場合、シェルスクリプトだとすると、シェルコマンドを含むファイル。 サブシェルの作成それを実行するために。サブシェルは自分自身を再初期化して、次のことを行います。その効果は、スクリプトを処理するために新しいシェルが呼び出されるのと同じです。しかし、親が覚えているコマンドの場所(以下の「SHELL BUILTIN COMMANDS」の下のハッシュを参照)は子が保持します。

プログラムがで始まるファイルの場合、#!最初の行の残りの部分はプログラムのインタプリタを指定します。 シェルは指定されたインタプリタを実行します。既定では、この実行可能ファイルの種類を処理しないオペレーティング システムで。 [...]

つまり、-lineを使用せずにコマンド./foo.shラインからコマンドを実行することは、サブシェルのファイルでコマンドを実行するのと同じです。foo.sh#!

$ ( echo "$BASHPID"; while true; do sleep 1; done )

そして#!たとえば、次を指す正しい行は次/bin/bashのとおりです。

$ /bin/bash foo.sh

おすすめ記事