このコマンドを実行するとき:
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/null
1
file
3
その後、残りのパラメーターには含まれているため、A=foo
コマンド名とは見なされません。開始するプロセスの環境変数に特定の値を提供します。B=bar
=
その後、コマンドとcmd
実際のパラメータが続きます。arg1
、、、。arg2
arg3
パイプは|
コマンド呼び出しの一部ではなく、両方の呼び出しを一緒に接続します。例:
CC=gcc make 2>&1 | LESS=--quit-at-eof less
ファイルディスクリプタ1への最初のプロセスの出力は、バッファとして機能する「パイプ」を介してファイルディスクリプタ0への入力として2番目のプロセスによって受信されます。
—
1. 実際に>
このような特殊文字の後に空白が来る場合があります。これが許可されていても、2つの(スペースで区切られた)文字列は1つの「エンティティ」として理解されるべきです。
答え2
|
プロセス間でデータを転送し、ストリームをファイル>
にリダイレクトするために使用されます。/dev/tty
ルートが所有する「ファイル」/デバイスであり、権限が666に設定されているため、パイプで接続しようとすると、シェルは/ dev / ttyを実行してデータを転送しようとしますが、実行権限がありません。 。