检测是否在虚拟终端中运行?


12

我想自动登陆tty1上登录,然后用vlock其锁定。

我如何从Bash中检测当前终端是否是控制台虚拟终端(例如tty1),以便我可以将该vlock行放入.bash_profile并仅在通过登录时才运行tty1


1
我认为您应该将标题更改为“如果在虚拟终端中运行则检测”,因为tty可能会误解为检测当前的外壳是否已连接到伪终端设备。
Joseph R.

@JosephR。感谢您指出这一问题,已修正
kiri

@JosephR:坏电话。伪终端设备是p  ty,而不是tty。即将恢复为原始标题。
Incnis Mrsi 2015年

Answers:


14

您可以使用tty获取当前虚拟终端的名称,然后使用以下case语句对其进行测试:

#!/bin/sh

case $(tty) in /dev/tty[0-9]*)
    vlock ;;
esac

甚至更好,而不是假设所有终端登录shell都是ttys。
kiri

1
无需排除X:如果脚本在X下的终端仿真器中运行,tty则将显示终端仿真器的伪终端,而不是X所运行的物理终端。
吉尔(Gilles)'所以

5

通常只需测试STDIN(FD0)就足够了:

[ -t 0 ] && echo "TTY available" || echo "No TTY available"

好的,因为.bash_profile是在登录Shell上调用的,并且普通的GUI登录没有终端,所以唯一的终端登录Shell应该是tty。好发现
kiri

1
如果此代码段包含在从文件重定向其标准输入的较大脚本中,则它将报告即使从VT运行也没有可用的TTY。
约瑟夫R.13年

1
@JosephR正确。该值通常与cronatjob一起使用,以避免脚本假定交互式输入时失败。
JRFerguson
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.