回答:
あなたの質問は、使用しているシェルがコマンドラインでのユーザー入力をどのように解析するかに密接に関連しています。
コマンドラインの最初の単語がプログラムで、特別なフォルダー(ほとんどがで定義されているPATH
)にあり、特別な文字が使用されていない場合(使用しているシェルによって異なります)、後続の単語はすべてスペースまたはタブで区切られて渡されます特別な形式のプログラム、つまり配列。各単語が配列内の1つの要素として。
呼び出すプログラムは、引数(配列にある)をどのように解釈するかは、プログラムの方法によって異なります。引数の構文がどのように見えるかについての準標準がいくつかありますが、一般的にプログラマは完全に自由です。したがって、最初の引数は、ファイルの名前、またはプログラマーがプログラムを作成したときに考えていたものとして解釈できます。
特殊文字<
または>
コマンドラインに追加する場合、シェルは、プログラムに渡される配列に単語を追加<
し>
たり、後続の単語を追加したりしません。と<
や>
シェルが基本となるカーネル(キーワードでサポートされている、空想のものを作るために開始します与えられた配管)。何を理解しなければならないあなたに何が起こっているかを把握するために、STDIN
そしてSTDOUT
(すぐに私は省略関連していないので、STDERR
)です。
端末に表示されるすべてのもの(ほとんどの場合、ディスプレイの一部)は、シェルまたは以前に起動した他のプログラムによって特別なファイル(unixではすべてがファイル)に書き込まれます。このファイルには特別なIDがあり、という名前STDOUT
です。プログラムがキーボードからデータを読みたい場合、キーボードを直接ポーリングするのではなく(少なくともほとんどの場合)、という特別なファイルから読み取りますSTDIN
。内部的に、このファイルは標準入力デバイス、ほとんどの場合キーボードに接続されています。
シェルは、読み出した場合<
、または>
解析されたコマンドラインでは操作STDIN
やSTDOUT
時間のために特定の種類に対応するプログラムが実行されています。STDIN
またSTDOUT
、端末や標準入力デバイスを指すのではなく、コマンドラインの後続のファイル名を指すようにします。
2行の場合
cat file_name
cat < file_name
対応する開発者がcat
データの読み取りSTDIN
またはファイルからのデータの読み取りを行うため、観察された動作は同じです。ファイルの名前は最初のコマンドライン引数(シェルが渡す配列の最初の要素cat
)として指定されます。その後、シェルに操作を指示しないため、端末のcat
コンテンツ全体file_name
またはSTDIN
端末に書き込みますSTDOUT
。2行目では、シェルSTDIN
がこの方法で操作します。これは、もはや標準入力デバイスを指さずfile_name
、現在の作業ディレクトリで呼び出されるファイルを指すことを思い出してください。
行のその他の場合
man < file_name
man
STDIN
引数なしで呼び出された場合、つまり空の配列から呼び出された場合、何も読み取ることはありません。だから行
man < file_name
等しい
man
たとえば、に渡すと、man
からSTDIN
も何かを読み取ります。コマンドラインでこのオプションを指定すると、端末から読み取った内容を表示できます。そう-l -
man
man
STDIN
man -l - < file_name
また機能します(ただしman
、ページャーだけでなく、ファイルの入力も解析するため、ファイルの内容と表示される内容が異なる可能性があることに注意してください)。
それでは、どのようSTDIN
、STDOUT
コマンドライン引数が解釈されると、対応する開発者にすべてのアップです。
私の答えが問題を解決することを願っています。
man
(man-db)のバージョンでSTDIN
は、指定された引数の-l
後に-
。からのデータをSTDIN
manページとして解釈するだけです。有効な引数のより詳細な説明とその解釈方法については、関連プログラムのマニュアルページを参照する必要があります。あなたの場合に相談してくださいman man
。たぶんあなたの同様のオプションがありますman
。STDIN
xargs
(上記のように)特定のプログラムのコマンドライン引数を読み取りたい場合は、その方法があります。
man man
は、私のOSでサポートしていないものを見つけました。とにかく、これら2つの概念を宣言してくれてありがとう。
それらは完全に異なっています。コマンドライン引数は配列でプログラムに渡され、プログラムで必要なことを実行できます。stdinは、プログラムがデータを要求する必要がある入力ストリームです。ファイルを処理するプログラムは多くの場合両方をサポートすることを選択しますが、手動でサポートする必要があります-ファイル名がコマンドライン引数として渡されたかどうかを確認し、そうでない場合は代わりにstdinから読み取ります
man
stdinを読んで表示するmanページを見つけることを期待しているようですが、これは本当に奇妙な動作です。いつそれを使いますか?cat
stdin を表示するという事実は、他に何もしないという事実の成果です。他のツールがそのように機能するとは思わない。たとえばgrep
、ファイル名を取得するか、から読み取ることができstdin
ますが、データを処理しますがstdin
、ファイル名を読み取らずにstdin
開きます
この動作が本当に必要な場合はxargs
、ファイルをコマンドライン引数に変換するを使用できます。
$ xargs man < file_name
または、cat
呼び出し内にman
呼び出しを埋め込むだけです。
$ man $(cat file_name)
man $(<file_name)
。
(<>)
ループで行いますSTDIN
か、コマンドライン引数ファイル名として...
man < file_name
は、この2つの概念を自分で理解できるようにすることです。説明を読んで、実装はコマンドの作成者によって決定されます。私が正しい場合、find
引数はむしろSTDINを処理しますか?
man -l - < file_name
するための使用について言及しましたが、私のシステムでは次のように失敗します:man
STDIN
STDERR
man -l - < tee man: invalid option -- l man, version 1.6c