我在全新安装的 Debian 系统上,通过 ssh 登录 /dev/pts/0,并输入以下命令
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 盒子讨厌我???
答案1
这是命令的输出clear
...
你跑了clear
。 clear
产生这些控制序列。 (它们只是在我的机器上的顺序不同。)
% 清除 |猫 -v ;回声 ^[[2J^[[H^[[3J %
在 ECMA-48 终端或终端仿真器上,这些控制序列会擦除显示并定位光标。
% 清除 |控制台解码 ECMA48 ED 2 杯0 ED 3 %
但该watch
命令解释其运行的进程的标准输出,并且不理解除一个之外的任何 ECMA-48 控制序列。它仅理解 1968 年的一些 TTY-37 控制字符和(如果-c
使用该标志)ECMA-48 的 SGR 控制序列。
它传递给 ncurses 的其他所有内容,它以插入符号表示法打印控制字符。但因为一个错误watch
,然后立即覆盖插入记号字符串的第二个字符,并且本应出现的内容^[[
与^[
inwatch
的输出相同。
......并且只有clear
命令。
shell脚本根本没有被引用:
watch -n 10 清除 > /dev/pts/0 ; netstat -tupn 2>/dev/null | netstat -tupn 2>/dev/null | grep -v 3306 > /dev/pts/0
所以这是两个顺序的管道:
watch -n 10 清除 > /dev/pts/0 netstat -tupn 2>/dev/null | netstat -tupn 2>/dev/null | grep -v 3306 > /dev/pts/0
重定向发生在命令运行之前,在两种情况下将标准输出重定向到它打开的伪终端反正。它们实际上是无操作的:
观看-n 10 清除 netstat -tupn 2>/dev/null | netstat -tupn 2>/dev/null | grep -v 3306
您的机器正在完全按照您的指示进行操作。
因此,您只是重复地观看命令的输出clear
,其输出不会被处理为控制序列,而只是以损坏的插入符号表示法打印。
退出watch
以运行netstat
命令一次。 ☺