Bash Vim:读取输入时出错

Bash Vim:读取输入时出错,bash,shell,vim,zsh,Bash,Shell,Vim,Zsh,我已经搜索过这个错误,但找不到解决方案 我遵循一个加入Linux世界的基本指南,并尝试创建一个.txt文件,使用该脚本在Vim中添加一些文本行。这应该行得通,但对我来说不行 这里是我的简单脚本(我使用的是zsh,如果它可能是一个重要信息的话): #/垃圾箱/垃圾箱 filename=test.txt vim$filename您应该删除filename=test.txt中的空格,并用命令检查最后一行之后是否没有空格。当您想在第一行打招呼时,请删除i:iHello^[后面的名称行 您是否用CTRL-

我已经搜索过这个错误,但找不到解决方案

我遵循一个加入Linux世界的基本指南,并尝试创建一个
.txt
文件,使用该脚本在Vim中添加一些文本行。这应该行得通,但对我来说不行

这里是我的简单脚本(我使用的是
zsh
,如果它可能是一个重要信息的话):

#/垃圾箱/垃圾箱
filename=test.txt

vim$filename您应该删除
filename=test.txt
中的空格,并用
命令检查最后一行之后是否没有空格。当您想在第一行打招呼时,请删除
i
iHello^[
后面的名称行

您是否用
CTRL-v ESC
输入了
^[/code>?它必须是一个字符。

您可以这样做:

#!/bin/sh

filename=test.txt

coms="iHello world^[:x ${filename}^M"
vim -c "normal $coms"
正如Walter A所说,您必须通过在
coms
变量中分别点击
Ctrl-V Esc
Ctrl-V Return
来替换
^[
^M

有关更多帮助,请参见
man vim
,以及vim
中的:h:normal

有一个打字错误(额外的空格)在分配给
filename
变量时:
filename=test.txt
。此表达式被解释为使用设置为空字符串的
filename
环境变量调用
test.txt
命令。因此,应删除
=
后的空格

关于读取输入消息的错误,请阅读Vim文档:
:help E208

当Vim在需要输入时无法读取键入的字符时,就会发生这种情况。Vim卡住了,它唯一能做的就是退出。当stdin和stderr都被重定向并执行一个不退出Vim的脚本时,就会发生这种情况

所以Vim认为它读取了一个没有退出Vim的脚本。您的脚本进入插入模式,进入
Hello
,然后Esc,最后调用
:x
命令。一切正常,
:x
命令退出Vim,当然,如果它是在命令行区域中输入的。如果您已经输入
^[
作为Control-V,Esc,脚本将退出插入模式并成功执行
:x
命令。因此,您将
^[
作为两个字符输入。因此,您真正的输入是
Hello^[:x
(脚本没有退出Vim):

Vim:警告:输入不是来自端子
Vim:读取输入时出错,正在退出。。。
维姆:保存文件。。。
维姆:完成了。
现在,如果将两个字符
^[
替换为实际的转义字符,并从同一目录执行脚本,它将因交换文件而失败:

Vim:警告:输入不是来自端子
Vim:读取输入时出错,正在退出。。。
维姆:完成了。
(您可以通过运行
vim test.txt
)读取详细说明。您可以使用
-n
选项忽略交换文件:
vim-n“$filename”
。现在输出为:

Vim:警告:输入不是来自端子
这是有道理的。实际上您不需要交互式版本的Vim。因此您应该使用ex模式(
-e
选项),或者更确切地说是改进的ex模式(
-e
选项):
Vim-n-e“$filename”

如果不应该解释内容,最好将值用单引号括起来,如果字符串包含shell变量,最好用双引号括起来:
filename='test.txt'

固定版本:

filename='test.txt'

vim-n-E“$filename”谢谢你!我用这两个字符写了
^[
。我还要学习比你能接受答案更好的vim命令:)。我经常使用here结构来编辑文件,但我切换到
sed-i
。对于交互式编辑,我仍然使用vi(m)1.非常感谢你,我会把这些都记在脑子里的
#!/bin/sh

filename=test.txt

coms="iHello world^[:x ${filename}^M"
vim -c "normal $coms"
Vim: Error reading input, exiting...