在 tty <&1
與 echo(tty <&1)
與 echo(tty <&1)
與 echo(tty <&1)
vs echo(tty <&2)
下面片段中的關鍵語句(即除了用於列印標籤和空白行的那些,用於間距)成對出現。在每一對中,第一個和第二個語句的形式分別為
tty...
和。echo $(tty...)
echo stdin: tty echo $(tty) echo echo stdout: tty <&1 echo $(tty <&1) echo echo stderr: tty <&2 echo $(tty <&2)
如果我獲取包含此片段的文件(例如,在一個
zsh
或bash
會話中),我會得到以下輸出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 行)生成的行顯著突出,原因有兩個:
- 它是- 生成的
echo $(tty ...)
行(即,第 3、7 和 11 行)中唯一與其tty ...
前面的 - 生成的對應物(第 2、6 和 10 行)不同的行;和- 它不同於形式上類似的輸出(第 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 之後關閉它。