コマンドラインコマンドを受信するプログラムはどれですか?

コマンドラインコマンドを受信するプログラムはどれですか?

ターミナルに「vim ファイル名」と書くと、vim がファイル名をパラメータとして受け取ることはわかっていますが、プログラムも vim をパラメータとして受け取るのではないかと思います... これはターミナル エミュレータだけでしょうか、それとも別のプログラムでしょうか?

答え1

コマンドラインに入力した時点ではvim filename、シェルはすでに起動しているため、シェル (およびターミナル エミュレーター) はvimコマンドライン引数として取得されません。

vim一方、プログラムにはありますが、これはユーザーには利用できません。プログラムが起動すると、その名前はいつもの0 番目のコマンドライン引数として与えられます。これは、シェルを起動して次のようにエコーすると確認できます$0

$ sh
$ echo $0
sh
$ exit

シェルはコマンドライン上のコマンドをexecve()(または同様のexec()関数)を使用して実行します。POSIX仕様言う

の値は、関数argv[0]の 1 つによって開始されるプロセスに関連付けられたファイル名文字列を指す必要がありますexec

argv[0]上記のテキストの は、$0シェル スクリプトの に対応します。

根拠のセクションでは次のように述べられています。

厳密に準拠したPOSIXアプリケーションの要件には、最初の引数として渡される値は、開始されるプロセスに関連付けられたファイル名の文字列になります。既存のアプリケーションの中には、状況によってはファイル名文字列ではなくパス名を渡すものもありますが、 は診断の出力によく使用されるため、ファイル名文字列の方が一般的には便利です。渡されるファイル名がファイルの実際のファイル名ではない場合もあります。たとえば、ログイン ユーティリティの多くの実装では、実際のファイル名の前に( )argv[0]を付ける規則が使用されています。これは、呼び出されるコマンド インタープリタに、それが「ログイン シェル」であることを示します。<hyphen-minus>-

関連情報