Linux

這是什麼:^[3;J^[H^[2J?

  • January 30, 2020

我在全新安裝的 Debian 系統上,通過 /dev/pts/0 上的 ssh 登錄,並輸入了以下命令

watch -n 10 clear > /dev/pts/0 ; netstat -tupn 2>/dev/null | grep -v 3306 > /dev/pts/0

我得到的看起來像這樣

Every 10.0s: clear                                              Thu Jan 30 17:42:01 2020

^[3;J^[H^[2J

為什麼這個linux盒子討厭我???

這是clear命令的輸出……

你跑了clearclear產生了這些控制序列。(它們只是在我的機器上以不同的順序排列。)

% 清除 | 貓-v;迴聲
^[[2J^[[H^[[3J.]
%

在 ECMA-48 終端或終端仿真器上,這些控制序列擦除顯示並定位游標。

% 清除 | 控制台解碼 ecma48
編 2
杯 0
編 3
%

但是該watch命令解釋它執行的程序的標準輸出,並且除了一個之外不理解任何 ECMA-48 控制序列。它只理解 1968 年的一些 TTY-37 控製字元和(如果使用-c標誌)來自 ECMA-48 的 SGR 控制序列。

它傳遞給 ncurses 的所有其他內容,以插入符號列印控製字元。但是由於 中的一個錯誤watch,插入符號字元串的第二個字元會立即被覆蓋,並且應該在的輸出中^[[出現。^[``watch

……只有clear命令。

根本沒有引用 shell 腳本:

觀看 -n 10 清除 > /dev/pts/0 ;netstat -tupn 2>/dev/null | grep -v 3306 > /dev/pts/0

所以這是兩個管道,依次:

watch -n 10 清除 > /dev/pts/0
netstat -tupn 2>/dev/null | grep -v 3306 > /dev/pts/0

重定向發生在命令執行之前,並且在兩種情況下將標準輸出重定向到它仍然打開的偽終端。它們實際上是無操作的:

觀看 -n 10 清除
netstat -tupn 2>/dev/null | grep -v 3306

你的機器正在做你告訴它做的事情。

因此,您正在clear反復觀察命令的輸出,其輸出並未作為控制序列處理,而只是以損壞的插入符號表示。

退出watch以執行您的netstat命令一次。☺

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