私はPipe(|
)がstdoutをサブシェルのstdinにパイプするために使用されることを学びました。
ただし、コマンドにはless
ファイル名パラメーターが必要です。less file1.txt
しかしls -l /root | less
。
したがって、この場合は時間がかかりません。stdin
文書これはの標準出力でls -l /root
作成されました。私の言葉は、実際にless stdin
自分の入札が少ない時を意味します。ところで、別の命令のために混乱します。これはtr
コマンドです。
tr
このコマンドは何も許可しません。文書引数の例tr a-z A-Z file1.txt
:キーボードからstdinを取得するか、stdinをリダイレクトします。ただし、ご注文はls -l /root | tr a-z A-Z
可能です。まあ、私の家は間違っていた。
パイプラインは実際にどのように機能しますか?基本原理は、パイプがメインシェルの標準出力をサブシェルの標準入力に渡すことです。しかし、メインシェルの標準出力がサブシェルの標準入力に行くという事実は知りませんでした。文書あるいは、キーボードで文字を入力する必要がある状況かもしれません。しかし、上記の例を見ると、シェルは両方のケースを考慮します。
答え1
私はパイプ(|)が標準出力をサブシェルの標準入力に渡すために使用されることを学びました。
左のコマンド stdout を右のコマンド stdin に渡します。これらのコマンドの一方または両方がサブシェルで実行されるかどうかは、シェルの実装によって異なります。
それにもかかわらず、シェルは引数が両方のコマンドのいずれかに渡されるかどうか気にしません。プログラムは、標準入力と標準出力を無視するなど、適切であると判断されたとおりに動作できます。
tty
さらに、プログラムは標準入力がインタラクティブキーボードであるかどうかを検出し、それに応じて動作することができます。これはless
コマンドで観察されるものです。引数が与えられない場合、標準入力は通常読み込まれますが、そうであれば処理を拒否しますtty
。ソースコード示す:
if (isatty(fd0))
{
error("Missing filename (\"less --help\" for help)", NULL_PARG);
quit(QUIT_OK);
}
答え2
だから私はこの場合は
less
次のものが必要だと思います。stdin
文書これはの標準出力でls -l /root
作成されました。
これは正確であり、あなたが観察したものと矛盾しませんtr
。
シェル管路Construct() は以下を生成します。PRODUCER | CONSUMER
匿名パイププロセスPRODUCER
とCONSUMER
。匿名パイプは、名前とディレクトリエントリがないが正常に読み書きできるファイル形式です。パイプでは、シェルはパイプの書き込み端を生産者の標準出力に接続し、パイプの読み取り端を消費者の標準入力に接続します。
このtr
コマンドはstdinからデータを読み込み、stdoutにのみ書き込みます。less
このコマンドは、コマンドラインにファイル名を渡さなかった場合にのみこれを行います。ファイル名を渡すと、less
標準入力ではなくこのファイルから読み取られます。実行される操作は、less
ファイルからデータを読み取る多くの同様のアプリケーションによる一般的な規則です。
あなたも正しいかもしれません。 。 。興味があるSTDOUTとSTDINを接続することはどういう意味ですか?そしてコマンドにどのように複数の出力がありますか?