~によるとヒリーの答え、less
開くことができない場合は、stderrからナビゲーションコマンドを読みます/dev/tty
。
私は他のプログラムのstderrストリームに書かれた内容を見たことがなく、それを実装する方法がわからないので、これは謎のようです。
読み書きのためにstderrを公開する目的は何ですか?これがうまくいけば、最新のシステムでどのように使用できますか? (例えば、stdinの代わりにstderrに何かをパイプする難解な構文はありますか?)
ベストアンサー1
最初は驚きました。しかし、答えを読んで調べてみると、十分簡単に見えます。これが私が見つけたものです。 (結局驚くことではありません。)
リダイレクトの前に、stdin、stdout、およびstderrは予想どおりに同じデバイスに接続されます。
#ctrl-alt-delor:~$
#↳ ll /dev/std*
lrwxrwxrwx 1 root root 15 Jun 3 20:58 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 Jun 3 20:58 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 Jun 3 20:58 /dev/stdout -> /proc/self/fd/1
#ctrl-alt-delor:~$
#↳ ll /proc/self/fd/*
lrwx------ 1 richard richard 64 Jun 30 19:14 /proc/self/fd/0 -> /dev/pts/12
lrwx------ 1 richard richard 64 Jun 30 19:14 /proc/self/fd/1 -> /dev/pts/12
lrwx------ 1 richard richard 64 Jun 30 19:14 /proc/self/fd/2 -> /dev/pts/12
したがって、ほとんどのリダイレクト(stderrなど)は後でリダイレクトされません。 stderrはまだターミナルに接続されています。したがって、キーボード入力を得るために読むことができます。
ファイルが予期しない方向で使用されるのを防ぐ唯一の方法は慣例であり、パイプは一方向です。
別の例については、以下を試してください。
cat | less
端末を読み取ろうとすると、ページをめくるとエラーが発生しますless
(当然、cat
端末を読むときも同様です)。
/dev/tty
さらに不思議なことは、にリンクされていないことです/proc/self
。
#ctrl-alt-delor:~$
#↳ ll /dev/tty
crw-rw-rw- 1 root tty 5, 0 Jun 29 09:18 /dev/tty
バラより現在の制御端末と `/dev/tty`の関係は何ですか?説明する。リンクを提供してくれた@StephenKittに感謝します。