回显您正在运行的终端的点数?

回显您正在运行的终端的点数?

我使用了一种缓慢的方法,即执行

$ 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/ttyif 存在控制终端,否则得到空字符串(而不是not a tty)。

无论如何,这可能是也可能不是终端设备。伪终端设备的路径形状随系统和版本的不同而不同,可以是/dev/pts/somenumber/dev/ptyx等。

相关内容