>と| /dev/ttyの違い

>と| /dev/ttyの違い

このコマンドを実行するとき:

echo "1" > /dev/tty # runs successfully 

しかし、私がこれを実行した場合:

echo "1" | /dev/tty #permission denied

これらの2つの演算子の違いは何>ですか|?パイプがエラーを引き起こすのはなぜですか?

答え1

短い答え: >&nその後、ファイル名または(nは数字)が続く必要があり、|他のコマンド呼び出しが続く必要があります。


詳細:シェル構文では、コマンド呼び出しには複数のコンポーネントが含まれます。例:

A=foo 2>/dev/null B=bar cmd arg1 arg2 >file 3>&4 arg3

ここで、パラメータ2>/dev/nullとはioリダイレクトを設定するために使用され、コマンドラインのどこにでも表示できる特別なパラメータ(エスケープされていない1を含む)>fileです。ファイル記述子 2 はにリダイレクトされ、ファイル記述子は (暗黙的に) にリダイレクトされ、ファイル記述子はファイル記述子 4 が連結されたものにリダイレクトされます。3>&4>/dev/null1file3

その後、残りのパラメーターには含まれているため、A=fooコマンド名とは見なされません。開始するプロセスの環境変数に特定の値を提供します。B=bar=

その後、コマンドとcmd実際のパラメータが続きます。arg1、、、。arg2arg3

パイプは|コマンド呼び出しの一部ではなく、両方の呼び出しを一緒に接続します。例:

CC=gcc make 2>&1 | LESS=--quit-at-eof less

ファイルディスクリプタ1への最初のプロセスの出力は、バッファとして機能する「パイプ」を介してファイルディスクリプタ0への入力として2番目のプロセスによって受信されます。


1. 実際に>このような特殊文字の後に空白が来る場合があります。これが許可されていても、2つの(スペースで区切られた)文字列は1つの「エンティティ」として理解されるべきです。

答え2

|プロセス間でデータを転送し、ストリームをファイル>にリダイレクトするために使用されます。/dev/ttyルートが所有する「ファイル」/デバイスであり、権限が666に設定されているため、パイプで接続しようとすると、シェルは/ dev / ttyを実行してデータを転送しようとしますが、実行権限がありません。 。

関連情報