tty [选项]...
功能
打印连接到标准输入的终端的文件名。
描述
命令项:
- -s, –silent, –quiet: 什么也不打印,只是返回退出状态码。
- –help: 打印帮助信息。
- –version: 打印版本信息并退出。
返回的状态码:
- 0 表示标准输入是一个终端。
- 1 表示标准输入不是一个终端。
- 2 表示给定的参数是不正确的参数。
- 3 表示发生了写错误。
举例
查看当前的标准终端文件描述符号
[quietheart@lv-k etc]$ tty
/dev/pts/6
这里,输入 tty
之后,输出 /dev/pts/6
就是当前连接的终端对应的文件描述符号,我们可以通过向这个文件,这样会看到当前终端会输出我们写入的数据,例如:
[quietheart@lv-k etc]$ echo "mytest" >/dev/pts/6
mytest
可见,向 /dev/pts/6
文件写入的内容,直接显示到我们的终端上面了。如果我在机器上面开了多个终端,然后我在别的终端中输入上面的 echo
命令,那么将会看到对应 /dev/pts/6
的终端上面会显示相应的字符了。
运行 tty
什么也不输出,然后查看其退出码
[quietheart@lv-k etc]$ tty -s
[quietheart@lv-k etc]$ echo $?
0
这里,使用 shell
的命令 echo $?
来显示上一条命令的退出状态码。
状态码的含义如下:
- 0 表示标准输入是一个终端。
- 1 表示标准输入不是一个终端。
- 2 表示给定的参数是不正确的参数。
- 3 表示发生了写错误。
其它
基本概念
-
tty
(终端设备的统称):tty
一词源于Teletypes
,或者teletypewriters
,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后来这东西被键盘与显示器取代,所以现在叫终端比较合适。终端是一种字符型设备,它有多种类型,通常使用tty
来简称各种类型的终端设备。 -
pty
(虚拟终端): 如果我们远程telnet
到主机或使用xterm
时,也需要一个终端交互,这就是虚拟终端pty
(pseudo-tty
) 。 -
pts/ptmx
(pts/ptmx
结合使用,进而实现pty
):pts
(pseudo-terminal slave)是pty
的实现方法,与ptmx
(pseudo-terminal master)配合使用实现pty
。
Linux终端
在Linux系统的设备特殊文件目录 /dev/
下,终端特殊设备文件一般有以下几种:
串行端口终端( /dev/ttySn
)
串行端口终端(Serial Port Terminal)是使用计算机串行端口连接的终端设备。计算机把每个串行端口都看作是一个字符设备。有段时间这些串行端口设备通常被称为终端设备,因为那时它的最大用途就是用来连接终端。这些串行端口所对应的设备名称是 /dev/tts/0
(或 /dev/ttyS0
), /dev/tts/1
(或 /dev/ttyS1
)等,设备号分别是 (4,0)
, (4,1)
等,分别对应于DOS系统下的 COM1
、 COM2
等。若要向一个端口发送数据,可以在命令行上把标准输出重定向到这些特殊文件名上即可。例如,在命令行提示符下键入: echo test > /dev/ttyS1
会把单词 test
发送到连接在 ttyS1
( COM2
)端口的设备上。可接串口来实验。
伪终端( /dev/pty/
)
伪终端(Pseudo Terminal)是成对的逻辑终端设备(即 master
和 slave
设备, 对 master
的操作会反映到 slave
上)。
例如 /dev/ptyp3
和 /dev/ttyp3
对儿,(或者在设备文件系统中分别是 /dev/pty/m3
和 /dev/pty/s3
)。它们与实际物理设备并不直接相关。如果一个程序把 ptyp3
( master
设备)看作是一个串行端口设备,则它对该端口的读/写操作会反映在该逻辑终端设备对应的另一个 ttyp3
( slave
设备)上面。而 ttyp3
则是另一个程序用于读写操作的逻辑设备。
这样,两个程序就可以通过这种逻辑设备进行互相交流,而其中一个使用 ttyp3
的程序则认为自己正在与一个串行端口进行通信,这很象是逻辑设备对之间的管道操作。这里,比较关键需要注意的是:对于 ttyp3
( s3
),任何设计成使用一个串行端口设备的程序都可以使用该逻辑设备;但对于使用 ptyp3
的程序,则需要专门设计来使用 ptyp3
( m3
)逻辑设备。
例如,如果某人在网上使用 telnet
程序连接到你的计算机上,则 telnet
程序就可能会开始连接到设备 ptyp2
( m2
)上(一个伪终端端口上)。此时一个 getty
程序就应该运行在对应的 ttyp2
( s2
)端口上。当 telnet
从远端获取了一个字符时,该字符就会通过 m2
、 s2
传递给 getty
程序,而 getty
程序就会通过 s2
、 m2
和 telnet
程序往网络上返回” login:
”字符串信息。这样,登录程序与 telnet
程序就通过“伪终端”进行通信。通过使用适当的软件,就可以把两个甚至多个伪终端设备连接到同一个物理串行端口上。
在使用设备文件系统 (device filesystem)之前,为了得到大量的伪终端设备特殊文件,使用了比较复杂的文件名命名方式。因为只存在16个 ttyp
( ttyp0
— ttypf
) 的设备文件,为了得到更多的逻辑设备对,就使用了象 q
、 r
、 s
等字符来代替 p
。例如, ttys8
和 ptys8
就是一个伪终端设备对。不过这种命名方式目前仍然在RedHat等Linux系统中使用着。
但Linux系统上的Unix98并不使用上述方法,而使用了 pty master
方式,例如 /dev/ptm3
。它的对应端则会被自动地创建成 /dev/pts/3
。这样就可以在需要时提供一个 pty
伪终端。目录 /dev/pts
是一个类型为 devpts
的文件系统,并且可以在被加载文件系统列表中看到。虽然“文件” /dev/pts/3
看上去是设备文件系统中的一项,但其实它完全是一种不同的文件系统。
即: TELNET ---> TTYP3(S3: slave) ---> PTYP3(M3: master) ---> GETTY
终端总结
对上述提到的Linux终端、串行终端、虚拟终端、伪终端概念进行总结如下:
- 终端:输入和输出设备(键盘+显示器)
- 虚拟终端:一台PC只有一套键盘和显示器,也就只有一套终端设备,但是可以通过
Ctrl+Alt+F1~Ctrl+Alt+F6
切换到字符终端,相当于有6套虚拟的终端设备,他们共用一套物理终端设备/dev/tty1~/dev/tty6 - 串行终端:与机器的串口对应,每一个串口对应的一个串行终端,串口对应的是物理终端
- 伪终端:虚拟终端和串行终端的数目是有限的,但是,网络端口和图形端窗口的数目确不受限制,这是因为它们是通过伪终端实现的。
- 控制终端:这是一个逻辑概念,即用户正在控制的终端,可以使串行终端,虚拟终端和伪终端
- 控制台终端:控制台终端可以认为是一个PC对应的一套键盘和显示器,所有虚拟终端是对应的都是同一控制台终端。
实践
以下过程是在ubuntu上面的实践结果。
1、虚拟终端 /dev/tty*
和伪终端 /dev/pts/*
假设5个 xterm
终端的话,会发现 /dev
下面有一个 /dev/ptmx /
和5个 /dev/pts/*
而如果用"[Ctrl][Alt]F1"进入一个终端的话,就会发现 /dev
下面多出一个 /dev/tty1
2、查看终端的方法
使用命令 tty
可以查看当前对应的终端,命令 ps -ax
可以查看所有程序以及对应的终端。通过这个命令,发现如果多开一个 screen
程序,或者用 telnet
登陆之后,那么机器上面就会多一个 /dev/pts/*
。可知,一般伪终端用户模拟终端程序。
3、向指定终端发送信息
如果运行 echo hello >/dev/tty2
, 那么 [Ctrl][Alt]F2
打开 /dev/tty2
对应的终端,就会发现刚才发送的 hello
了。
注意,如果发送 echo -n ls >/dev/tty2
那么会显示 ls
,但是回车之后,并没有执行 ls
。可见: ttyN
是代表linux的纯命令行终端,而写到这个终端的字符串只是做为这个终端的输出,并没有当做终端的输入处理。
如果运行 echo hello >/dev/pts/2
, 那么,就可以在 xterm
的第二个窗口看到 hello
了。可知, /dev/pts/n
是Xwindows模式下的伪终端.