如何获取运行bash的tty?


24

此页面提出的第二种方法中,使用以下命令获取正在运行bash的tty:

ps ax | grep $$ | awk '{ print $2 }'

我个人认为这确实有点懒,列出所有正在运行的进程只是为了提取其中一个。这样做会不会更有效(我也在问这是否会带来不良影响)?

ps -p $$ | tail -n 1 | awk '{ print $2 }'

仅供参考,我遇到了这个问题,因为有时第一个命令实际上会产生两行(或更多行)。当会有另一个进程运行包含PID $$作为子字符串的PID时,这将是随机发生的。在第二种方法中,我通过请求我知道自己想要的PID来避免此类情况。


6
最有效的方法是tty在您的bash会话中运行命令。如果您坚持使用 ps-– ps -p $$ -o tty=
iruvar,

Answers:


46

只需键入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 }'

(更合理的变体)


是的,确实是第一个建议的解决方案(实际上是tty | sed -e "s:/dev/::")。但是我认为该页面上第二个建议的解决方案不仅效率低下,而且是错误的!我会使用tty并停止抱怨。:)
Sheljohn

您会注意到,第一个还返回pty正在运行的进程的信息grep
雅库耶

2
grep如果您使用,则不需要awk。例如ps ax | awk "/^$$/ {print \$2}"-请注意使用双引号而不是单引号和逸出\$2。但是,正如您所说,使用tty是正确的解决方案。
cas

像这样进行抓取可能会导致错误匹配,例如,如果您的PID为10,并且还有awk -vpid=$$ '$1 == pid {print $2}'
PID103

我只是在这里指出,tty在node.js中生成完全不起作用,而ps和朋友一起工作就很好。
史蒂文·卢

17

如果您想提高效率,那么是的,您ps可以过滤到所涉及的进程(这将是更正确的做法,这样做不会冒着捡起名称中恰好有您的进程号的命令的风险,这是正确的) )。不仅如此,还可以告诉它不要生成标头(选项h),从而消除该tail过程,而仅显示TTY字段(选项o tty),从而消除该awk过程。

因此,这是您的简化命令:

ps hotty $$

10

其他方式:

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 $$

2
(1)我很高兴您意识到进程的当前/控制tty与任何文件描述符都没有关联,并且不能保证在任何fd上都可以打开它。但是,您是否尝试过提供作为该应急方案的解决方法的命令?尝试时,我得到的只是/dev/tty,而不是控制tty(如所报道ps)。(2)我相信这{ readlink /dev/fd/0; } < /dev/tty(并且将永远)等同于readlink /dev/fd/0 < /dev/tty–您是否认为其他?如果是这样,您能证明这一点吗?(3)命令中的第二个分号(后面的/dev/tty)是不必要的。
斯科特

6

仅出于完整性考虑,虽然上面提到的其他ps命令在Linux ps -p $$ -o tty=上都可以使用,但是@ 1_CR提到的ps命令在所有现代Unix系统上都是最可移植的,因为它仅使用Unix Standard中定义的选项。


2

在交互式外壳中,可以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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.