在我的脚本中我按照这样运行vim:
$EDITOR hello.c
然后我执行它:
./script.sh hello.c <stdin >>stdout 2>>stderr; echo $? >>errcode
有人知道为什么输出如下:
[?1049h[?1h=[1;24r[?12;25h[?12l[?25h[27m[m[H[2J[?25l[24;1H"/home/sandbox/ios-15-1/desc1_file/xvysta02/hello.c" 6L, 77C[1;1H[35m#include [m[31m<stdio.h>[m
[32mint[m main()
{
printf([31m"Hello world[m[35m\n[m[31m"[m);
[33mreturn[m [31m0[m;
}
[1m[34m~ [8;1H~ [9;1H~ [10;1H~ [11;1H~ [12;1H~ [13;1H~ [14;1H~ [15;1H~ [16;1H~ [17;1H~ [18;1H~ [19;1H~ [20;1H~ [21;1H~ [22;1H~ [23;1H~ [m[24;63H1,1[11CAll[1;1H[?12l[?25h[24;1H[?1l>[?1049lVim: Error reading input, exiting...
Vim: Finished.
[24;1H
而不是:
running editor with: /.sanitized./hello.c (hash da427fd)
似乎打印出文件hello.c的内容
这是我的学校项目,所以输出来自测试脚本。
答案 0 :(得分:1)
您无法在脚本中以交互方式重定向,以交互方式启动Vim。 Vim打印出各种ANSI Escape序列来控制终端,这就是你所看到的。你没有提到你正在使用Vim的内容,所以这里是对脚本中自动化文本操作的一般性介绍:
除非你真的需要特殊的Vim功能,否则最好使用非交互式工具,如sed
,awk
或Perl / Python / Ruby / < em>您最喜欢的脚本语言。
也就是说,你可以非交互式地使用Vim:
对于非常简单的文本处理(即使用Vim,如增强型'sed'或'awk',可能只是受益于:substitute
命令中增强的正则表达式),请使用 Ex-mode
REM Windows
call vim -N -u NONE -n -i NONE -es -S "commands.ex" "filespec"
注意:静默批处理模式(:help -s-ex
)会混淆Windows控制台,因此您可能需要在Vim运行后执行cls
清理。
# Unix
vim -T dumb --noplugin -n -i NONE -es -S "commands.ex" "filespec"
注意:如果"commands.ex"
文件不存在,Vim将等待输入;更好地检查它的存在!或者,Vim可以从stdin读取命令。您还可以使用从stdin读取的文本填充新缓冲区,如果使用-
参数,则从stderr读取命令。
对于涉及多个窗口的更高级处理,以及Vim的真实自动化(您可以与用户交互或让Vim运行以让用户接管),请使用:
vim -N -u NONE -n -c "set nomore" -S "commands.vim" "filespec"
以下是使用过的参数的摘要:
-T dumb Avoids errors in case the terminal detection goes wrong.
-N -u NONE Do not load vimrc and plugins, alternatively:
--noplugin Do not load plugins.
-n No swapfile.
-i NONE Ignore the |viminfo| file (to avoid disturbing the
user's settings).
-es Ex mode + silent batch mode -s-ex
Attention: Must be given in that order!
-S ... Source script.
-c 'set nomore' Suppress the more-prompt when the screen is filled
with messages or output to avoid blocking.
答案 1 :(得分:0)
vim正在使用控制字符来制作交互式屏幕。 当你想使用vim重定向时,尝试类似
的东西vi hello.c >/dev/null 2>@1 <<end
:1,$ s/world/StackOverflow/
:wq
end
带有end的行必须从第一列开始,后面没有空格。
当你想用这种结构玩更多时,你可以进入插入模式,
输入内容并“点击转义键”。使用CTRL-V ESC
放置转义的转义键。