実際に渡されるコマンドライン引数(例:"some.text")はどこにありますか?

実際に渡されるコマンドライン引数(例:"some.text")はどこにありますか?

私が知る限り、コマンドに渡された引数はSTDINストリームに渡されます。

だからこれ:

cut -d. -f2 'some.text'

正確には次のようになります。

echo 'some.text' | cut -d. -f2

STDINに送信するときsome.text。最初のケースではパラメータを介し、2番目のケースではパイプを介して。

some.textSTDINでない場合、最初のサンプルのパラメータはどこに行きますか?

答え1

いいえ、コマンドラインを介して渡された引数はSTDINに自動的に渡されませんが、必要に応じて解釈できる別の変数としてプログラムに提供されます。これらの変数は通常argcとargvと呼ばれます。

多くのUnixツール(cut、head、tail、catなど)は、STDINまたはコマンドラインのファイルを介して入力を受け取ることができます。

したがって、echo 'some.text' | cut -d. -f2効果は次のようになります。

echo 'some.text' > temporary_file
cut -d. -f2 temporary_file
rm temporary_file

答え2

コマンドラインパラメータとプログラム入力はまったく同じではありません。彼らは同じ道に従わずに異なる解釈を持っています。

このコマンドはcut先行引数を-オプションとして解釈し、他の引数を入力ファイル名(他の多くのコマンドと同様)として解釈します。

パラメーターは、以下を介してプログラムに渡されます。execveシステムコール。これ環境その横を通り過ぎました。プログラムはメモリ内の1つの場所からパラメータを読み取ることができます。プログラミング言語は通常、パラメータにアクセスするための変数または関数を提供します。Cのargvパラメータmain

標準入力はファイル記述子0. 慣例上、プログラムが読めるようにあらかじめ開いているファイルです。入力をリダイレクトせずに端末でコマンドを実行すると、標準入力が端末から出力されます(つまり、入力した内容)。リダイレクトされたファイルの入力を使用すると、mycommand <input_file標準入力がそのファイルにリンクされます。パイプでコマンドを実行すると、command1 | command2標準入力がcommand2標準入力に接続されますcommand2

答え3

STDINとプログラムコマンド(パラメータを含む)はまったく異なります。 STDINは、プログラムが読めるファイルです。端末、ディスクファイル、デバイス、ソケットなどに接続できます。プログラムコマンドは一連の文字列で、最初の文字列はプログラム名です。これはプログラムmain()関数に引数として渡されます。

答え4

-d -f2コマンドライン引数(たとえば、最初の例では、、)を参照している場合は、'some.text'すべて関連項目に移動します。プログラム

コマンドライン引数には、出力が進行する場所、または入力が入る場所を指定する情報を含めることもできます。たとえば、最初の例ではファイル名があるということは、データがファイルからのものであることを意味し、2番目の例ではファイル名がない場合、両方の場合にstdin出力がstdout

関連情報