Answers:
只需键入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
并停止抱怨。:)
pty
正在运行的进程的信息grep
。
grep
如果您使用,则不需要awk
。例如ps ax | awk "/^$$/ {print \$2}"
-请注意使用双引号而不是单引号和逸出\$2
。但是,正如您所说,使用tty
是正确的解决方案。
awk -vpid=$$ '$1 == pid {print $2}'
tty
在node.js中生成完全不起作用,而ps
和朋友一起工作就很好。
如果您想提高效率,那么是的,您ps
可以过滤到所涉及的进程(这将是更正确的做法,这样做不会冒着捡起名称中恰好有您的进程号的命令的风险,这是正确的) )。不仅如此,还可以告诉它不要生成标头(选项h
),从而消除该tail
过程,而仅显示TTY
字段(选项o tty
),从而消除该awk
过程。
因此,这是您的简化命令:
ps hotty $$
其他方式:
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 $$
/dev/tty
,而不是控制tty(如所报道ps
)。(2)我相信这{ readlink /dev/fd/0; } < /dev/tty
(并且将永远)等同于readlink /dev/fd/0 < /dev/tty
–您是否认为其他?如果是这样,您能证明这一点吗?(3)命令中的第二个分号(后面的/dev/tty
)是不必要的。
仅出于完整性考虑,虽然上面提到的其他ps命令在Linux ps -p $$ -o tty=
上都可以使用,但是@ 1_CR提到的ps命令在所有现代Unix系统上都是最可移植的,因为它仅使用Unix Standard中定义的选项。
在交互式外壳中,可以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
tty
在您的bash会话中运行命令。如果您坚持使用ps
-–ps -p $$ -o tty=