Bashがスクリプトを実行すると、ls -la /proc/<pid of bash>/fd
「255 -> /path/to/script」と表示されます。私はbashがファイル記述子255を介してスクリプトを読み込み、コマンドを1行ずつ実行すると思います。
しかし、bashがスクリプトを受け取ったとき、私はls -la /proc/<pid of bash>/fd
それを見つけることができませんcat /proc/<pid of bash>/maps
。
質問があります。 bashがスクリプトを受け取ったら、bashはスクリプトをどのように読みますか?スクリプトファイルを読み取る特別な方法はありますか?
答え1
ふと状況を分析してみたい考えが浮かんだstrace
。
初めて実行すると、出力はstrace -f -p <pid>
次のようになります。
openat(AT_FDCWD, "./test", O_RDONLY) = 3...
[pid 3408] dup2(3, 255) = 255
[pid 3408] 閉じる(3) = 0
「test」は実行するシェルスクリプトです。 「3408」はサブシェルのpidです。 「test」はファイル記述子3で開き、ファイル記述子255にコピーされる。したがって、ls -la /proc/<pid of bash>/fd
「255 -> /some/directory/test」と表示されます。
ただし、スクリプトをインポートすると、「test」が開き、バッファに読み込まれ、すぐに閉じます。したがって、ls -la /proc/<pid of bash>/fd
上記の項目は表示されません。
bashがなぜこのように実装するのかわかりません。