man tty
から
tty-標準入力に接続されている端末のファイル名を出力します
$ tty
/dev/pts/2
APUEから:
歴史的に、UNIXシステムのほとんどのバージョンでの制御端末の名前は
/dev/tty
でした。 POSIX.1は、制御端末の名前を判別するために呼び出すことができるランタイム関数を提供します。#include <stdio.h> char *ctermid(char *ptr);
$ ls -la /dev/tty
crw-rw-rw- 1 root tty 5, 0 May 26 00:16 /dev/tty
それで、コマンドtty
の出力とファイル/dev/tty
の両方が、現在のbashプロセスの制御端末を参照しているかどうか疑問に思いましたか?
はいの場合、コマンドtty
が/dev/pts/2
とは異なる疑似端末スレーブファイル/dev/tty
を出力するのはなぜですか?
ターミナルエミュレータlxterminal
とその中で実行されているbashシェルは疑似端末ペアを使用しているので、疑似端末スレーブ/dev/pts/2
はbashシェルの制御端末ではありませんか?
/dev/tty
と/dev/pts/2
は相互にシンボリックリンクではないので、異なるファイルですか?
ありがとう。
フォローアップの投稿 現在の制御端末と `/ dev/tty`の間にはどのような関係がありますか?
コマンドtty
(1)は、標準入力に接続されている端末の名前を返します。これは制御端末である場合とそうでない場合があります。プロセスには制御端子がある場合もありますが、その端子を標準入力に接続する必要があることは石で書かれていません。
POSIXから tty
(1)のマニュアルページ :
Ttyユーティリティは、標準入力として開いている端末の名前を標準出力に書き込みます。使用される名前は、POSIX.1‐2008のシステムインターフェイスボリュームで定義されている
ttyname()
関数によって返される文字列と同等でなければなりません。
自分で試してみてください。実行
< /dev/null sh -c 'tty; sleep 10; echo "Done."'
標準入力は(疑似)端末ではないため、tty
によって書き出された「notatty」というメッセージが表示されたら、Ctrl + Cを押します。
一方、 /dev/tty
は、プロセスが実際に制御端末を持っている場合、常にプロセスの制御端末の同義語です。
コマンド
tty
の出力とファイル/dev/tty
は両方とも、現在のプロセスの制御端末を参照していますか?
いいえ、同じではありません。 tty
接続されているttyの名前を出力します標準入力。これは、必ずしも制御端末( /dev/tty
が指すもの)と同じではありません。
$ tty
/dev/pts/12
$ tty < /dev/pts/1
/dev/pts/1
$ tty < /dev/null
not a tty
もちろん、通常、stdin
が端末に接続されている場合、それは制御端末です。
私が見たtty
のユースケースは、スクリプトがインタラクティブに実行されているかどうかを判断することです。そのために、制御端末の代わりにstdin
をチェックすると、stdin
が端末以外に接続されていて、ユーザーがインタラクティブな入力を提供できない状況を検出できます。例えば。インタラクティブシェルからmaybe_interactive.sh < some_input_file
を実行します。
/ dev/ttyと/ dev/pts/2は相互にシンボリックリンクではないので、それらは異なるファイルですか?
/dev/tty
は、制御端末がプロセスごとに異なり、シンボリックリンクはプロセスごとに同じであるため、シンボリックリンクにすることはできません。