linux的tty命令的詳細(xì)解釋
linux的tty命令的詳細(xì)解釋
Linux中的tty命令其實(shí)是打印連接到標(biāo)準(zhǔn)輸入的終端的文件名。下面由學(xué)習(xí)啦小編為大家整理了Linux的tty命令的詳細(xì)解釋,希望對(duì)大家有幫助!
linux的tty命令的詳細(xì)解釋
tty [選項(xiàng)]...
[功能]
打印連接到標(biāo)準(zhǔn)輸入的終端的文件名。
[描述]
命令項(xiàng):
-s, --silent, --quiet: 什么也不打印,只是返回退出狀態(tài)碼。
--help: 打印幫助信息。
--version: 打印版本信息并退出。
返回的狀態(tài)碼:
0 表示標(biāo)準(zhǔn)輸入是一個(gè)終端。
1 表示標(biāo)準(zhǔn)輸入不是一個(gè)終端。
2 表示給定的參數(shù)是不正確的參數(shù)。
3 表示發(fā)生了寫錯(cuò)誤。
linux的tty命令的詳解實(shí)例
*查看當(dāng)前的標(biāo)準(zhǔn)終端文件描述符號(hào):
[quietheart@lv-k etc]$ tty
/dev/pts/6
這里,輸入tty之后,輸出"/dev/pts/6"就是當(dāng)前連接的終端對(duì)應(yīng)的文件描述符號(hào),我們可以通過向這個(gè)文件,這樣會(huì)看到當(dāng)前終端會(huì)輸出我們寫入的數(shù)據(jù),例如:
[quietheart@lv-k etc]$ echo "mytest" >/dev/pts/6
mytest
可見,向/dev/pts/6文件寫入的內(nèi)容,直接顯示到我們的終端上面了。如果我在機(jī)器上面開了多個(gè)終端,然后我在別的終端中輸入上面的echo命令,那么將會(huì)看到對(duì)應(yīng)"/dev/pts/6"的終端上面會(huì)顯示相應(yīng)的字符了。
*運(yùn)行tty什么也不輸出,然后查看其退出碼:
[quietheart@lv-k etc]$ tty -s
[quietheart@lv-k etc]$ echo $?
0
這里,使用shell的命令"echo $?"來顯示上一條命令的退出狀態(tài)碼。狀態(tài)碼的含義如下:
0 表示標(biāo)準(zhǔn)輸入是一個(gè)終端。
1 表示標(biāo)準(zhǔn)輸入不是一個(gè)終端。
2 表示給定的參數(shù)是不正確的參數(shù)。
3 表示發(fā)生了寫錯(cuò)誤。
補(bǔ)充:有關(guān)linux的tty命令的其它知識(shí)
*基本概念:
1,tty(終端設(shè)備的統(tǒng)稱):
tty一詞源于Teletypes,或者teletypewriters,原來指的是電傳打字機(jī),是通過串行線用打印機(jī)鍵盤通過閱讀和發(fā)送信息的東西,后來這東西被鍵盤與顯示器取代,所以現(xiàn)在叫終端比較合適。終端是一種字符型設(shè)備,它有多種類型,通常使用tty來簡(jiǎn)稱各種類型的終端設(shè)備。
2,pty(虛擬終端):
如果我們遠(yuǎn)程telnet到主機(jī)或使用xterm時(shí),也需要一個(gè)終端交互,這就是虛擬終端pty(pseudo-tty)
3,pts/ptmx(pts/ptmx結(jié)合使用,進(jìn)而實(shí)現(xiàn)pty):
pts(pseudo-terminal slave)是pty的實(shí)現(xiàn)方法,與ptmx(pseudo-terminal master)配合使用實(shí)現(xiàn)pty。
*Linux終端:
在Linux系統(tǒng)的設(shè)備特殊文件目錄/dev/下,終端特殊設(shè)備文件一般有以下幾種:
1,串行端口終端(/dev/ttySn)
串行端口終端(Serial Port Terminal)是使用計(jì)算機(jī)串行端口連接的終端設(shè)備。計(jì)算機(jī)把每個(gè)串行端口都看作是一個(gè)字符設(shè)備。有段時(shí)間這些串行端口設(shè)備通常被稱為終端設(shè)備,因?yàn)槟菚r(shí)它的最大用途就是用來連接終端。這些串行端口所對(duì)應(yīng)的設(shè)備名稱是/dev/tts/0(或/dev/ttyS0), /dev/tts/1(或/dev/ttyS1)等,設(shè)備號(hào)分別是(4,0), (4,1)等,分別對(duì)應(yīng)于DOS系統(tǒng)下的COM1、COM2等。若要向一個(gè)端口發(fā)送數(shù)據(jù),可以在命令行上把標(biāo)準(zhǔn)輸出重定向到這些特殊文件名上即可。例如,在命令行提示符下鍵入:echo test > /dev/ttyS1會(huì)把單詞”test”發(fā)送到連接在ttyS1(COM2)端口的設(shè)備上??山哟趤韺?shí)驗(yàn)。
2,偽終端(/dev/pty/)
偽終端(Pseudo Terminal)是成對(duì)的邏輯終端設(shè)備(即master和slave設(shè)備, 對(duì)master的操作會(huì)反映到slave上)。
例如/dev/ptyp3和/dev/ttyp3(或者在設(shè)備文件系統(tǒng)中分別是/dev/pty/m3和 /dev/pty/s3)。它們與實(shí)際物理設(shè)備并不直接相關(guān)。如果一個(gè)程序把ptyp3(master設(shè)備)看作是一個(gè)串行端口設(shè)備,則它對(duì)該端口的讀/ 寫操作會(huì)反映在該邏輯終端設(shè)備對(duì)應(yīng)的另一個(gè)ttyp3(slave設(shè)備)上面。而ttyp3則是另一個(gè)程序用于讀寫操作的邏輯設(shè)備。
這樣,兩個(gè)程序就可以通過這種邏輯設(shè)備進(jìn)行互相交流,而其中一個(gè)使用ttyp3的程序則認(rèn)為自己正在與一個(gè)串行端口進(jìn)行通信。這很象是邏輯設(shè)備對(duì)之間的管道操作。對(duì)于ttyp3(s3),任何設(shè)計(jì)成使用一個(gè)串行端口設(shè)備的程序都可以使用該邏輯設(shè)備。但對(duì)于使用ptyp3的程序,則需要專門設(shè)計(jì)來使用 ptyp3(m3)邏輯設(shè)備。
例如,如果某人在網(wǎng)上使用telnet程序連接到你的計(jì)算機(jī)上,則telnet程序就可能會(huì)開始連接到設(shè)備 ptyp2(m2)上(一個(gè)偽終端端口上)。此時(shí)一個(gè)getty程序就應(yīng)該運(yùn)行在對(duì)應(yīng)的ttyp2(s2)端口上。當(dāng)telnet從遠(yuǎn)端獲取了一個(gè)字符時(shí),該字符就會(huì)通過m2、s2傳遞給 getty程序,而getty程序就會(huì)通過s2、m2和telnet程序往網(wǎng)絡(luò)上返回”login:”字符串信息。這樣,登錄程序與telnet程序就通過“偽終端”進(jìn)行通信。通過使用適當(dāng)?shù)能浖?,就可以把兩個(gè)甚至多個(gè)偽終端設(shè)備連接到同一個(gè)物理串行端口上。
在使用設(shè)備文件系統(tǒng) (device filesystem)之前,為了得到大量的偽終端設(shè)備特殊文件,使用了比較復(fù)雜的文件名命名方式。因?yàn)橹淮嬖?6個(gè)ttyp(ttyp0—ttypf) 的設(shè)備文件,為了得到更多的邏輯設(shè)備對(duì),就使用了象q、r、s等字符來代替p。例如,ttys8和ptys8就是一個(gè)偽終端設(shè)備對(duì)。不過這種命名方式目前仍然在RedHat等Linux系統(tǒng)中使用著。
但Linux系統(tǒng)上的Unix98并不使用上述方法,而使用了”pty master”方式,例如/dev/ptm3。它的對(duì)應(yīng)端則會(huì)被自動(dòng)地創(chuàng)建成/dev/pts/3。這樣就可以在需要時(shí)提供一個(gè)pty偽終端。目錄 /dev/pts是一個(gè)類型為devpts的文件系統(tǒng),并且可以在被加載文件系統(tǒng)列表中看到。雖然“文件”/dev/pts/3看上去是設(shè)備文件系統(tǒng)中的一項(xiàng),但其實(shí)它完全是一種不同的文件系統(tǒng)。
即: TELNET ---> TTYP3(S3: slave) ---> PTYP3(M3: master) ---> GETTY
*實(shí)踐:
以下過程是在ubuntu上面的實(shí)踐結(jié)果。
1,虛擬終端/dev/tty*和偽終端/dev/pts/*:
假設(shè)5個(gè)xterm終端的話,會(huì)發(fā)現(xiàn)/dev下面有一個(gè)/dev/ptmx /和5個(gè)/dev/pts/*
而如果用"[Ctrl][Alt]F1"進(jìn)入一個(gè)終端的話,就會(huì)發(fā)現(xiàn)/dev下面多出一個(gè)/dev/tty1
2,查看終端的方法:
使用命令"tty"可以查看當(dāng)前對(duì)應(yīng)的終端,命令"ps -ax"可以查看所有程序以及對(duì)應(yīng)的終端。通過這個(gè)命令,發(fā)現(xiàn)如果多開一個(gè)screen程序,或者用telnet登陸之后,那么機(jī)器上面就會(huì)多一個(gè)/dev/pts/*??芍话銈谓K端用戶模擬終端程序。
3,向指定終端發(fā)送信息:
如果運(yùn)行"echo hello >/dev/tty2",
那么"[Ctrl][Alt]F2"打開"/dev/tty2"對(duì)應(yīng)的終端,就會(huì)發(fā)現(xiàn)剛才發(fā)送的hello了。
注意,如果發(fā)送"echo -n ls >/dev/tty2"那么會(huì)顯示ls,但是回車之后,并沒有執(zhí)行l(wèi)s。可見:ttyN是代表linux的純命令行終端,而寫到這個(gè)終端的字符串只是做為這個(gè)終端的輸出,并沒有當(dāng)做終端的輸入處理。
如果運(yùn)行"echo hello >/dev/pts/2",
那么,就可以在xterm的第二個(gè)窗口看到hello了??芍?,/dev/pts/n是Xwindows模式下的偽終端.