![如何获取bash正在运行的tty?](https://linux22.com/image/85727/%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96bash%E6%AD%A3%E5%9C%A8%E8%BF%90%E8%A1%8C%E7%9A%84tty%EF%BC%9F.png)
在提出的第二种方法中这一页,可以使用以下命令获取正在运行 bash 的 tty:
ps ax | grep $$ | awk '{ print $2 }'
我心里想,这确实有点懒,列出所有正在运行的进程只是为了提取其中一个进程。这样做不是更有效(我还想问这是否会带来不必要的影响):
ps -p $$ | tail -n 1 | awk '{ print $2 }'
仅供参考,我遇到了这个问题,因为有时第一个命令实际上会产生两行(或更多)行。当另一个进程正在运行且其 PID 包含$$
子字符串时,这种情况会随机发生。在第二种方法中,我通过请求我知道我想要的 PID 来避免这种情况。
答案1
只需输入tty
:
$ tty
/dev/pts/20
太简单、太明显了,不太真实:)
编辑:正如您所注意到的,第一个还返回pty
正在运行的进程的信息:grep
$ ps ax | grep $$
28295 pts/20 Ss 0:00 /bin/bash
29786 pts/20 S+ 0:00 grep --color=auto 28295
因此,您需要过滤掉 grep 以获得仅一个结果,这变得很难看:
ps ax | grep $$ | grep -v grep | awk '{ print $2 }'
或使用
ps ax | grep "^$$" | awk '{ print $2 }'
(更理智的变体)
答案2
如果您想提高效率,那么是的,您是对的,ps
可以过滤到有问题的进程(并且它会更正确,而不是冒着选择名称中恰好包含您的进程号的命令的风险)。不仅如此,还可以告诉它不生成标题(选项h
),从而消除该tail
过程,并且仅显示TTY
字段(选项o tty
),从而消除该awk
过程。
所以这是你的简化命令:
ps hotty $$
答案3
其他方法:
readlink /dev/fd/0 #or 1 or 2
readlink /proc/self/fd/0 #or 1 or 2
readlink -f /dev/stdin #or stdout or stderr; f to resolve recursively
#etc.
(如果您所在的 shell 的 stdin、stdout 和 stderr 未连接到其控制终端,则可以通过打开以下命令获取控制终端的文件描述符/dev/tty
:
( { readlink /dev/fd/0; } </dev/tty; ) </dev/null >output 2>&1
)
或者与ps
:
ps h -o tty -p $$ #no header (h); print tty column; for pid $$
答案4
在交互式 shell 中,可以使用w
命令来实现这一点。在下面的示例中,w
报告自身正在由特定用户运行,当然它还显示了运行该命令的 TTY。
$ w
11:20:08 up 5 min, 3 users, load average: 0.34, 0.39, 0.20
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
xieerqi :0 :0 11:15 ?xdm? 1:47 0.34s init --user
xieerqi pts/0 :0 11:18 23.00s 0.05s 0.05s /bin/mksh
xieerqi pts/10 :0 11:20 0.00s 0.03s 0.01s w