如何获取bash正在运行的tty?

如何获取bash正在运行的tty?

在提出的第二种方法中这一页,可以使用以下命令获取正在运行 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

相关内容