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=