'tty'コマンドの出力と '/dev/tty'ファイルは現在のbashプロセスの制御端末を指していますか?

'tty'コマンドの出力と '/dev/tty'ファイルは現在のbashプロセスの制御端末を指していますか?
  1. ~からman tty

    tty - 標準入力に接続された端末のファイル名を出力します。

    $ tty
    /dev/pts/2
    
  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シェルは疑似ターミナルペアを使用するので、疑似ターミナルスレーブはbash/dev/pts/2シェルのコントロールターミナルではありませんか?

/dev/tty/dev/pts/2互いにシンボリックリンクではないので、異なるファイルですか?

ありがとうございます。

フォローアップ投稿現在の制御端末と `/dev/tty`の関係は何ですか?

答え1

コマンドtty(1) は、標準入力に接続された端末の名前を返します。これは制御端末であってもなくてもよい。プロセスに制御端末があるかもしれませんが、端末が標準入力に接続する必要があることはわかりません。

POSIXではtty(1)のマニュアルページ:

ttyユーティリティは、標準入力で開かれた端末の名前を標準出力に書き込む必要があります。使用される名前は、 ttyname()POSIX.1-2008システムインタフェースボリュームで定義されている関数によって返された文字列と同じでなければなりません。

自分で試してみてください。

< /dev/null sh -c 'tty; sleep 10; echo "Done."'

ttystdinは(擬似)端末ではないので、「not a tty」というメッセージを見た後、Ctrl + Cを押してください。

一方、は/dev/tty常にプロセスの制御端末と同義です。ただし、プロセスが実際に持つ制御端末

答え2

コマンドの出力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異なるプロセスの制御端末が異なっており、シンボリックリンクがプロセスごとに同一であるため、シンボリックリンクにすることはできない。

関連情報