web-dev-qa-db-ja.com

コマンド `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シェルは疑似端末ペアを使用しているので、疑似端末スレーブ/dev/pts/2はbashシェルの制御端末ではありませんか?

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

ありがとう。

フォローアップの投稿 現在の制御端末と `/ dev/tty`の間にはどのような関係がありますか?

1
Tim

コマンド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は、プロセスが実際に制御端末を持っている場合、常にプロセスの制御端末の同義語です。

3
AlexP

コマンド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は、制御端末がプロセスごとに異なり、シンボリックリンクはプロセスごとに同じであるため、シンボリックリンクにすることはできません。

2
ilkkachu