Bash Vim:读取输入时出错
我已经搜索过这个错误,但找不到解决方案 我遵循一个加入Linux世界的基本指南,并尝试创建一个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-
.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...