tty
有没有一种通用方法可以在 shell 中找到未使用的内容,例如bash
?
以下似乎可行,但我想一定有更好的方法吗?
$ used=$({ find /proc/{0..9}*/fd/0 -printf '%l$\n' | grep tty;} 2> /dev/null)
$ unused=$(find /dev/ -name 'tty*' | grep -ve "$used")
答案1
假设您指的是 Linux 虚拟终端,则可以VT_OPENQRY
ioctl()
获取第一的免费的虚拟终端(例如所使用的openvt
),但您已经需要控制台设备的文件描述符。或者,您可以(以 root 身份)执行以下操作:
comm -23 <(printf '%s\n' /dev/tty[1-9]*) \
<(lsof -Fn /dev/tty[1-9]* | sed -n 's/^n//p' | sort -u)
您可以将其推广到其他类型的 tty 设备,例如串行设备。
/dev/ttyxx
这将更加稳健,因为它只会考虑这些设备路径,并且不会出现带有正则表达式运算符或换行符的文件名问题,但就像您的方法一样,如果 tty 设备通过该设备的任何其他路径打开,则该方法将无法正常工作。
另一种方法是依赖设备编号而不是它们的典范小路。
使用 GNU stat
:
find -L /proc/[1-9]*/fd/. ! -name . -prune -type c -exec stat -Lc '%t %T' {} + |
awk '$1 == "4" {seen[$2]}
END {
for (i=1; i<=63; i++)
if (!(sprintf("%x", i) in seen))
print "/dev/tty" i
}'