為什麼我不能使用重定向將 Vim 的標準輸入更改為磁碟上的某個文件?
我正在閱讀“ The UNIX Time-Sharing System Dennis M. Ritchie 和 Ken Thompson ”論文,作為標準輸入/輸出重定向的範例,它給出了 ed 編輯器的範例:
該命令
ed <script
將腳本解釋為編輯器命令文件;因此“<script
”的意思是“從script
. 獲取輸入”。但是,如果我使用 vim 嘗試相同的操作,我會收到一條錯誤消息“讀取輸入錯誤”:
[m@localhost rough]$ vim t2 <t Vim: Warning: Input is not from a terminal Vim: Error reading input, exiting... Vim: preserving files... Vim: Finished.
為什麼會這樣?
ed
並且ex
是行編輯器。它們具有可以由文本文件中的行驅動的那種使用者界面。
vi
它的所有複製版本(例如 VIM)都是全屏編輯器。它們具有不將輸入和輸出視為文本文件行的使用者界面。輸入是單個字元和未分組為行的字元序列。輸出是用於在影片終端上繪圖的單個字元、轉義和控制序列。作為文本文件的使用者 I/O模型無法映射到互動式全屏 TUI 程序,更不用說映射到 GUI 程序了。
您得到的行為因程序而異。一些全屏 TUI 程序會在它們的標準輸入不是終端時辨識併中止,就像
nvi
這樣。其他人,如 VIM,會發出警告,但會將非終端輸入文件視為終端輸入,這對於希望將輸入視為腳本命令的人來說會產生一些奇怪的行為。還有一些,less
例如,顯式地為使用者界面打開一個終端設備,並且不為其(輸入部分)使用標準 I/O。還有一些像大多數 shell(請注意,它們具有超過行模式的互動式使用者界面)一樣,仍處於非互動模式。一篇 1974 年寫的關於 Unix 的論文不能很好地指導行模式使用者界面和全屏使用者界面之間的區別。第一個 Unix 影片終端編輯器 George Coulouris 可能
em
是在未來一年。未來還有 termcap、帶有(他們自己的)命令行編輯的 shell,以及使用非圖形特殊字元的行規則預設值。