Tty

tty <&1echo(tty <&1)echo(tty <&1)echo(tty <&1) vs echo(tty <&2)

  • October 7, 2021

下面片段中的關鍵語句(即除了用於列印標籤和空白行的那些,用於間距)成對出現。在每一對中,第一個和第二個語句的形式分別為tty...和。echo $(tty...)

echo stdin:
tty
echo $(tty)

echo

echo stdout:
tty <&1
echo $(tty <&1)

echo

echo stderr:
tty <&2
echo $(tty <&2)

如果我獲取包含此片段的文件(例如,在一個zshbash會話中),我會得到以下輸出1(我隨後添加了行號,以供參考):

1    stdin:
2    /dev/pts/8
3    /dev/pts/8
4    
5    stdout:
6    /dev/pts/8
7    not a tty
8    
9    stderr:
10    /dev/pts/8
11    /dev/pts/8

在此輸出中,由echo $(tty <&1)(第 7 行)生成的行顯著突出,原因有兩個:

  1. 它是- 生成的echo $(tty ...)行(即,第 3、7 和 11 行)中唯一與其tty ...前面的 - 生成的對應物(第 2、6 和 10 行)不同的行;和
  2. 它不同於形式上類似的輸出(第 11 行)echo $(tty <&2)

**問:**如何解釋這兩個差異?


作為記錄,我試圖在 的手冊頁中找到這些明顯異常的解釋tty,但是,據我所知,該頁面根本沒有解決這些問題2;當然不是明確的3。

這個問題是由一些程式碼激發的,這是我早期問題的一個很好的答案。


1當然,/dev/pts/如果我更換終端后實際數字會有所不同,如果您嘗試相同的事情,您可能會有所不同。

2事實上,tty我係統上可用的手冊頁的整個說明部分僅包含一句話:“列印連接到標準輸入的終端的文件名。”。

3在這裡,我保留一個可能性,即比我擁有更多背景知識的人可能能夠從’s 簡潔的手冊頁中推斷tty出上述行為。

tty報告(在其標準輸出上)在其標準輸入(其 fd 0)上打開的 tty 設備的名稱。

在:

tty <&2

簡稱

tty 0<&2

shell 將 fd 0 重定向到與 fd 2 上打開的資源相同的資源(dup2(2, 0)在新程序中執行 a 然後tty在該程序中執行。因此tty在其 fd 0 和 2 上將具有相同的資源並在 fd 1 上寫入 tty 即兩者都打開(如果有)。

同樣的情況發生在:

tty <&1

在:

echo "$(tty <&1)"

但是,該命令替換的 fd 1 進入管道(並且 shell 讀取tty另一端的輸出),它與 fd 1echo進入的資源不同。

如果您想知道 fd 1 上打開了什麼 tty 並使用命令替換,您需要類似以下內容:

{ echo "$(tty <&3)"; } 3<&1

所以對於正在執行的程序tty,我們有:

  • 3:同外1
  • 1:一根管子
  • 2:原封不動
  • 0:同3,所以同外1

因此可以將連接到外部tty標準輸出的 tty 設備的路徑寫入該管道。

由於 tty 不需要那個 fd 3,你可以讓它更乾淨一點:

{ echo "$(tty <&3 3<&-)"; } 3<&1

也就是說,在你使用它複製到 fd 0 之後關閉它。

引用自:https://unix.stackexchange.com/questions/672249