我使用了一种缓慢的方法,即执行
$ ps | grep bash | grep -oP '/[0-9]+' | grep -oP '[0-9]+'
完成同样事情的更好方法是什么?
答案1
好吧,你可以简单地发出:
tty
例子:
$ tty
/dev/pts/0
如果你仅有的想要终端的号码,请执行以下操作:
$ tty | grep -Po '\d+$'
0
从man tty
:
姓名 tty - 打印连接到的终端的文件名 标准输入
答案2
此解决方案的优点是,如果 TTY 不是以下格式,它会输出空字符串并返回失败/dev/pts/###
:
tty | grep -Po '(?<=^/dev/pts/)\d+$'
答案3
ps -o tty= -p "$$"
给你控制终端(以未指定的格式,但在我知道的实现中,这是没有前缀的设备路径/dev/
) pid 为 in 的进程$$
,这是执行 shell 的进程。ps
它本身将是该进程的子进程或该进程的子进程,并且将位于同一会话中,因此具有相同的控制 tty。
这将与 tty 指向的相同/dev/tty
。
如果会话没有控制 tty(通常,如果 shell 不是在终端中启动,而是由某些守护进程启动cron
并在阴影中运行),则您将得到?
.如果执行 shell 的进程已死亡,您将不会得到任何输出。
该tty
命令打印在 stdin 上打开的 tty 设备的路径(如果有)以及类似于不是 tty如果没有则出错。
所以:
controlling_tty=$(ps -o tty= -p "$$")
case $controlling_tty in
('?') echo>&2 'No controlling tty'; exit 1;;
('') echo>&2 'Cannot determine the controlling tty'; exit 1;;
(*) controlling_tty=/dev/$controlling_tty;;
esac
printf '%s\n' "The controlling tty is $controlling_tty"
或者
if ! tty_on_stdin=$(tty); then
echo>&2 'No tty on stdin or cannot determine which it is'
exit 1
fi
printf '%s\n' "The tty on stdin is $tty_on_stdin"
在大多数现实生活中,$controlling_terminal
和$tty_on_stdin
都是相同的,但不一定如此。
根据您的用例,您可能更喜欢其中之一。例如,您可以用来tty
找出输入来自哪个终端。ps
找出按哪个终端^C
会发送 SIGINT,tty<&1
找出输出转到哪个终端,tty<&2
以查找错误。
你可以使用:
tty=$(tty) || { tty=$(tty<&3); } 3<&1 || tty=$(tty<&2)
在 stdin、stdout 或 stderr 上查找 tty 并将找到的第一个存储在$tty
.
这就是 zsh 的$TTY
特殊变量所包含的内容,除了如果三个文件描述符都没有到达 tty 时,您会得到/dev/tty
if 存在控制终端,否则得到空字符串(而不是not a tty
)。
无论如何,这可能是也可能不是伪终端设备。伪终端设备的路径形状随系统和版本的不同而不同,可以是/dev/pts/somenumber
或/dev/ptyx
等。