1 tty的由来
在 1830 年代和 1840 年代,开发了称为电传打字机(teletypewriters)的机器,这些机器可以将发件人在键盘上输入的消息“沿着线路”发送在接收端并打印在纸上。
电传打字机的名称由teletypewriters, 缩短为teletypes,并最终缩短为 TTY。
电传打字机:teletypewriters → teletypes → tty
在电子计算机问世后,电传打字机成为那个时代与大型小型计算机和大型计算机交互的默认方式,并在软件中模拟演变为伪电传打字机或虚拟电传打字机 (PTS:pseudo terminal device)。
在 Linux 和其他类 Unix 操作系统(如 macOS)的桌面环境中,终端窗口和应用程序(如 x-term 和 Konsole)都是虚拟电传打字机的示例。
2 linux中的tty
在Linux中,我们的终端窗口是电传打字机 (TTY) 的软件仿真,作为伪电传打字机 (PTS) 连接到伪电传打字机多路复用器。
Linux的设备一般位于/dev目录下,我们可以使用命令
ls /dev/tty*
来查看系统中的tty设备。如:
csdn @ edu zsh $ ls /dev/tty*
/dev/tty
csdn @ edu zsh $ bash
[csdn ~]$ ls /dev/tty*
/dev/tty
在csdn提供的Linux测试环境中,只有1个tty设备。
在实际的Linux系统中,可能存在多个tty设备,如:
user @ host bash $ls /dev/tty*
/dev/tty /dev/tty23 /dev/tty39 /dev/tty54 /dev/ttyAMA3 /dev/ttyS0
/dev/tty0 /dev/tty24 /dev/tty4 /dev/tty55 /dev/ttyp0 /dev/ttyS1
/dev/tty1 /dev/tty25 /dev/tty40 /dev/tty56 /dev/ttyp1 /dev/ttyS10
/dev/tty10 /dev/tty26 /dev/tty41 /dev/tty57 /dev/ttyp2 /dev/ttyS11
/dev/tty11 /dev/tty27 /dev/tty42 /dev/tty58 /dev/ttyp3 /dev/ttyS12
/dev/tty12 /dev/tty28 /dev/tty43 /dev/tty59 /dev/ttyp4 /dev/ttyS13
/dev/tty13 /dev/tty29 /dev/tty44 /dev/tty6 /dev/ttyp5 /dev/ttyS14
/dev/tty14 /dev/tty3 /dev/tty45 /dev/tty60 /dev/ttyp6 /dev/ttyS15
/dev/tty15 /dev/tty30 /dev/tty46 /dev/tty61 /dev/ttyp7 /dev/ttyS2
/dev/tty16 /dev/tty31 /dev/tty47 /dev/tty62 /dev/ttyp8 /dev/ttyS3
/dev/tty17 /dev/tty32 /dev/tty48 /dev/tty63 /dev/ttyp9 /dev/ttyS4
/dev/tty18 /dev/tty33 /dev/tty49 /dev/tty7 /dev/ttypa /dev/ttyS5
/dev/tty19 /dev/tty34 /dev/tty5 /dev/tty8 /dev/ttypb /dev/ttyS6
/dev/tty2 /dev/tty35 /dev/tty50 /dev/tty9 /dev/ttypc /dev/ttyS7
/dev/tty20 /dev/tty36 /dev/tty51 /dev/ttyAMA0 /dev/ttypd /dev/ttyS8
/dev/tty21 /dev/tty37 /dev/tty52 /dev/ttyAMA1 /dev/ttype /dev/ttyS9
/dev/tty22 /dev/tty38 /dev/tty53 /dev/ttyAMA2 /dev/ttypf
user @ host bash $
2.1 tty命令的功能、格式和说明
tty 命令将打印您的伪电传从属设备用于连接到主设备的设备文件的名称。实际上,这就是您的终端窗口的编号。输入命令: tty --help可以查看tty命令的帮助信息,其中包括了命令格式和说明
user @ edu bash $ tty --help
Usage: tty [OPTION]...
Print the file name of the terminal connected to standard input.-s, --silent, --quiet print nothing, only return an exit status
--help display this help and exit
--version output version information and exitGNU coreutils online help: <http://www.gnu.org/software/coreutils/>
Report tty translation bugs to <http://translationproject.org/team/>
For complete documentation, run: info coreutils 'tty invocation'
2.1.1 命令格式
tty [-s][--help][--version]
2.1.2 参数说明
- -s或--silent或--quiet 不显示任何信息,只回传状态代码。
- --help 在线帮助。
- --version 显示版本信息。
下面我们结合实例来看看tty命令。
2.2 tty命令的实例
2.2.1 tty不带参数:显示当前终端
csdn @ edu bash $ tty
/dev/pts/1
在终端输入tty命令可以看到我们我们已连接到位于 /dev/pts/1 的设备文件。
2.2.2 tty -s
-s(静默)选项让 tty 不生成任何输出。但它执行完成后,仍会产生一个退出值。
在bash中:
csdn @ edu bash $ tty -s; if [ $? ]; then echo $? ":is in a tty"; else echo $? ":is not in a tty"; fi
0 :is in a tty
在zsh中:
csdn @ edu zsh $ tty -s; if [ $? ]; then; echo $? ":is in a tty"; else echo $? ":is not in a tty"; fi
0 :is in a tty
可以看到,tty -s顺利执行后退出值为0。
其实tty命令的退出值还有可能是:
- 0:如果标准输入来自 模拟的或物理的TTY 设备。
- 1:如果标准输入不是来自 TTY 设备。
- 2:语法错误,使用了不正确的命令行参数。
- 3:发生写入错误。
所以,我们可以对上面的实例,使用 case in语句 做进一步的修改:
csdn @ edu zsh $ tty -s; case $? in; 0) echo 0-ok;; 1) echo 1-no tty;; 2) echo 2-bad cmd;; 3) echo 3-write error;; esac
0-ok