当我这样做时ls /dev/tty*
,我看到以下输出:
/dev/tty /dev/tty12 /dev/tty17 /dev/tty21 /dev/tty26 /dev/tty30 /dev/tty35 /dev/tty4 /dev/tty44 /dev/tty49 /dev/tty53 /dev/tty58 /dev/tty62 /dev/ttyS0
/dev/tty0 /dev/tty13 /dev/tty18 /dev/tty22 /dev/tty27 /dev/tty31 /dev/tty36 /dev/tty40 /dev/tty45 /dev/tty5 /dev/tty54 /dev/tty59 /dev/tty63 /dev/ttyS1
/dev/tty1 /dev/tty14 /dev/tty19 /dev/tty23 /dev/tty28 /dev/tty32 /dev/tty37 /dev/tty41 /dev/tty46 /dev/tty50 /dev/tty55 /dev/tty6 /dev/tty7 /dev/ttyS2
/dev/tty10 /dev/tty15 /dev/tty2 /dev/tty24 /dev/tty29 /dev/tty33 /dev/tty38 /dev/tty42 /dev/tty47 /dev/tty51 /dev/tty56 /dev/tty60 /dev/tty8 /dev/ttyS3
/dev/tty11 /dev/tty16 /dev/tty20 /dev/tty25 /dev/tty3 /dev/tty34 /dev/tty39 /dev/tty43 /dev/tty48 /dev/tty52 /dev/tty57 /dev/tty61 /dev/tty9
格式很好,我可以在终端内的适度块中看到所有文件。
但是当我以这种方式运行这个命令时watch -d -n1 'ls /dev/tty*'
,我看到:
Every 1.0s: ls /dev/tty* debian: Wed Jun 30 21:08:06 2021
/dev/tty
/dev/tty0
/dev/tty1
/dev/tty10
/dev/tty11
/dev/tty12
/dev/tty13
/dev/tty14
/dev/tty15
/dev/tty16
/dev/tty17
/dev/tty18
/dev/tty19
/dev/tty2
/dev/tty20
/dev/tty21
...
因此,输出以垂直方式列出,不适合我的屏幕。是什么原因?我该如何解决这个问题?
答案1
是什么原因?
当watch
执行命令时,它们不连接到终端。换句话说,isatty(3)
返回 0。您可以使用以下 isatty.c 来检查命令运行时是否已连接到终端:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
printf("%d\n", isatty(STDOUT_FILENO));
return EXIT_SUCCESS;
}
编译:
gcc isatty.c -o isatty
在终端模拟器中运行:
$ ./isatty
1
在手表中运行它:
$ watch ./isatty
Every 2.0s: ./isatty darkstar: Wed Jun 30 20:42:51 2021
0
我该如何解决这个问题?
在 watch 中使用-C
ls 选项:
watch -d -n1 'ls -C /dev/tty*'
答案2
上面给出的答案很好,因为它ls
提供了一个选项来执行与检测到 TTY 时相同的工作。但如果您想在其他命令上执行此操作(没有这样的选项),一个简单的方法是:
$ watch 'unbuffer ls /dev/tty*'
unbuffer
[1] 基本上创建一个 tty,并使用它来停止否则进行的缓冲。副作用是它运行的程序(在本例中为ls
)会看到 TTY - 因此将完全执行您在终端中看到的操作。