~から
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シェルは疑似ターミナルペアを使用するので、疑似ターミナルスレーブは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."'
tty
stdinは(擬似)端末ではないので、「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
異なるプロセスの制御端末が異なっており、シンボリックリンクがプロセスごとに同一であるため、シンボリックリンクにすることはできない。