Luc*_*rri 4 vim bash shell zsh
我已经搜索过此错误,但找不到解决方案。
我正在遵循加入 Linux 世界的基本指南,并且我正在尝试创建一个.txt
文件,并使用该脚本在 Vim 中添加一些文本行。它应该有效,但在我的情况下无效。
这是我的简单脚本(我正在使用zsh
,如果它可能是重要信息):
#!/bin/sh
filename= test.txt
vim $filename << COMMAND
i
Hello
^[
:x
COMMAND
Run Code Online (Sandbox Code Playgroud)
脚本失败并显示消息:Vim: error reading input
。
我哪里错了?
filename
变量赋值中有一个拼写错误(一个额外的空格):filename= test.txt
。此表达式被解释为使用设置为空字符串的环境变量调用test.txt
命令filename
。所以你应该删除=
.
关于Error reading input消息,请阅读 Vim 文档:help E208
:
Run Code Online (Sandbox Code Playgroud)Vim: Error reading input, exiting...
当需要输入时 Vim 无法读取键入的字符时会发生这种情况。Vim 卡住了,它唯一能做的就是退出。当 stdin 和 stderr 都被重定向并执行不退出 Vim 的脚本时,就会发生这种情况。
所以 Vim 认为它读取了一个没有退出 Vim 的脚本。您的脚本进入插入模式,输入Hello
,然后Esc,最后调用:x
命令。万事大吉,:x
命令退出Vim,当然是在命令行区输入的。如果您输入^[
为Control- V, Esc,则脚本将退出插入模式并:x
成功执行命令。因此,您输入^[
了两个字符。所以你真正的输入是Hello^[:x
(并且脚本没有退出 Vim):
Vim: Error reading input, exiting...
Run Code Online (Sandbox Code Playgroud)
现在如果你用^[
实际的转义字符替换这两个字符,并从同一目录执行脚本,它会因为交换文件而失败:
Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: preserving files...
Vim: Finished.
Run Code Online (Sandbox Code Playgroud)
(您可以通过运行阅读详细说明vim test.txt
)。您可以使用-n
选项忽略交换文件:vim -n "$filename"
。现在输出将是:
Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: Finished.
Run Code Online (Sandbox Code Playgroud)
这说得通。您实际上不需要 Vim 的交互式版本。所以,你应该使用Ex模式(-e
可选),或者更确切地说,改善ex模式(-E
选择): vim -n -E "$filename"
。
同时,这也是包装在单引号中的值,如果是不应该的内容来解释一个好主意,并在双引号,如果字符串包含shell变量:filename='test.txt'
。
固定版本:
Vim: Warning: Input is not from a terminal
Run Code Online (Sandbox Code Playgroud)
(^[
在 Vim 中使用Control- v,输入Esc)。
归档时间: |
|
查看次数: |
4475 次 |
最近记录: |