2016-04-24 20 views
3

我一直在閱讀Unix編程環境 &執行包含的練習。我明白這項工作有點過時,但我發現它是一個很好的資源。努力從Unix編程環境重現終端(1983)

在第一章中,有幾個練習,其中向讀者介紹與終端&的交互,要求解釋交互。這裏是一個例子:

練習1-1。解釋與

$ date\@ 

在文本發生了什麼,它解釋了@被解釋爲行刪除字符。我的系統上的等價物是^u,但我可以用stty kill @模仿書中的終端。

基於閱讀&我的直覺,我希望的date\@調用的東西返回的效果:

[email protected]: command not found 

文本支持這樣一個道理:

如果您之前任#@由反斜槓\,它失去了它的特殊含義。所以要輸入#或@,輸入\#\@

我的問題是,我甚至無法在我的終端中鍵入示例。只要我輸入@,該行就會被刪除。反斜槓看起來並不會逃避行消除字符。

假設我對轉義字符如何與終端控制字符交互是正確的,我如何設置我的系統(Ubuntu GNU/Linux)來模擬文本行爲?

這裏是另一個類似的活動:

練習1-2。大多數shell(儘管不是第7版shell)將#解釋爲引入註釋,並忽略從#到行尾的所有文本。鑑於此,解釋以下成績單,假設你的擦除字符也#

$ date 
Mon Sep 26 12:39:56 EDT 1983 
$ #date 
Mon Sep 26 12:40:21 EDT 1983 
$ \#date 
$ \\#date 
#date: not found 
$ 

設置爲#我刪除字符,這是不可能複製這個成績單。反斜槓似乎不會轉義擦除字符。

回答

2

在Shell執行前,終端獲取並響應您的擊鍵。所以shell終於沒有機會逃離@,因爲終端首先刪除整行。

當你鍵入

stty kill @ 

你告訴殼告訴終端每次按下@

類型時殺線

stty kill ^u 

,你的shell會開始表現你期望的方式和^你會殺死你的線。

^v是終端的轉義字符
\是shell的轉義字符。

+0

恐怕這不能回答我的問題。我知道如何恢復我的終端的原始行爲。我想知道爲什麼用反斜槓轉義_line kill_字符似乎沒有任何作用。 – r1b

+0

,因爲終端首先讀取行消除字符。不要讓shell讀取。你跟終端通話,終端與shell進行通話。如果你告訴終端殺死一條線路,它不會將線路發送到外殼。 –

+0

該文本表明內核中有另一種解釋反斜槓的機制:_「當擦除或行殺字符前面加上反斜槓時,內核丟棄反斜槓並保留下列字符而不解釋」_「。這不再是這種情況嗎?有什麼辦法可以模仿這種行爲嗎? – r1b