在filename
變量中有一個錯字(額外空格):filename= test.txt
。該表達式被解釋爲調用test.txt
命令,filename
環境變量設置爲空字符串。所以你應該刪除=
之後的空格。
關於錯誤讀取輸入消息時,讀出的Vim文檔::help E208
:
Vim: Error reading input, exiting...
這發生時,同時需要輸入的Vim不能讀取輸入的字符。 Vim卡住了,唯一能做的就是退出。當stdin和stderr被重定向並執行一個不會退出Vim的腳本時,可能會發生這種情況。
所以Vim認爲它讀了一個沒有退出Vim的腳本。您的腳本進入插入模式,輸入Hello
,然後輸入Esc,最後調用:x
命令。一切都很好,當然,:x
命令退出Vim,如果輸入命令行區域。如果你已經進入^[
作爲控制 - V,Esc鍵,該腳本將已經退出插入模式和成功執行:x
命令。因此,您輸入^[
作爲兩個字符。所以,你的實際輸入爲Hello^[:x
(和腳本沒有退出VIM):如果你的實際轉義字符替換兩個字符^[
,並從同一目錄執行腳本
Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: preserving files...
Vim: Finished.
現在,將失敗,因爲一個交換文件:
Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: Finished.
(你可以閱讀通過運行vim test.txt
長描述)。您可以使用-n
選項忽略交換文件:vim -n "$filename"
。現在輸出將是:
Vim: Warning: Input is not from a terminal
它是有道理的。你實際上不需要Vim的交互式版本。所以你應該使用ex模式(-e
選項),或者更確切地說改進的ex模式(-E
選項):vim -n -E "$filename"
。
如果內容不應該被解釋,那麼將值包裝在單引號中也是一個好主意,如果字符串包含外殼變量,則在雙引號中包含值:filename='test.txt'
。
固定的版本:
filename='test.txt'
vim -n -E "$filename" << COMMAND
i
Hello
^[
:x
COMMAND
(^[
使用控制 Vim中輸入 - v,Esc鍵)。
非常感謝你,我會把這一切都放在我的腦海裏:D –