だから、私はこれをよく理解していると思ったが、テストを実行して(誰かに反対した会話に応じて)、私の理解に欠陥があることがわかりました...
可能な限り詳細に、シェルでファイルを実行すると正確に何が起こるのでしょうか?私が意味するのは、./somefile some arguments
シェルに入力somefile
してreturnキーを押すと(そしてcwdに存在し、読み取りと実行の許可がありますsomefile
)、フードの下で何が起こるのですか?
私が考えた答えでした。
- シェルはにsyscallを作成し
exec
、パスを渡しますsomefile
- カーネルが調べ
somefile
ではとルックスのマジックナンバーファイルのそれは、プロセッサが処理できる形式であるかどうかを判断します - ファイルがプロセッサが実行できる形式であることをマジック番号が示している場合、
- 新しいプロセスが作成されます(プロセステーブルのエントリを使用)
somefile
読み取り/メモリにマップされます。スタックが作成され、実行のコードのエントリポイントにジャンプされるsomefile
と、ARGV
パラメータの配列に初期化(char**
、["some","arguments"]
)
- マジック番号がある場合シェバング次いで、
exec()
上記のように、新しいプロセスを生成するが、実行可能な使用は、インタプリタシェバング(例えばによって参照され/bin/bash
又は/bin/perl
)とsomefile
に渡されSTDIN
- ファイルに有効なマジックナンバーがない場合、「無効なファイル(不良なマジックナンバー):Execフォーマットエラー」などのエラーが発生します。
ただし、ファイルがプレーンテキストの場合、シェルはコマンドを実行しようとします(入力したかのように)と誰かに言われましたbash somefile
。私はこれを信じていませんでしたが、試しただけで、それは正しかったです。ですから、ここで実際に何が起こっているのかについて誤解があり、その仕組みを理解したいと思います。
シェルでファイルを実行するとどうなりますか?(詳細は合理的です...)
source somefile
./somefile
ただし、によって分岐される新しいプロセスとは大きく異なります。
./somefile
bashがコマンドを実行することになるとは思いsomefile
ませんでした。私はそれがエラーを表示するだけで、代わりに効果的に見えると思ったsource somefile
somefile
ています。テキストファイルの場合、実行しようとすると新しいシェルが生成されることを確認できます。ファイルecho $$
を実行する場合とソースとする場合の動作は異なります。