使用exec vi时出错

时间:2016-09-28 05:32:30

标签: bash shell scripting vi heredoc

#!/bin/bash

if [ $# -ne 1 ]
then
   echo "USAGE:vitest filename"
else

FILENAME=$1

exec vi $FILENAME <<EOF
i
Line 1.
Line 2.
^[
ZZ
EOF

fi

exit 0

我尝试使用此处的doc和命令向Exec vi输入第1行和第2行。

运行脚本时,它给出了以下内容:

Vim(?):Warning: Input is not from a terminal
Vim: Error reading input, exiting...

Press ENTER or type command to continueVim: Finished.
Vim: Error reading input, exiting...

Vim: Finished.

4 个答案:

答案 0 :(得分:3)

您希望在vi模式下启动ex,并对脚本进行一些细微更改。

vi -e "$FILENAME" <<EOF
i
Line 1.
Line 2.
.
wq
EOF

exec几乎肯定是不必要的,特别是因为exit之后有一个vi命令。 exec用于使用给定命令替换当前脚本;不需要简单地执行命令。

UNIX文本编辑器的简史:

  • ed是原始编辑器,旨在与电传打字机而不是视频终端配合使用。
  • exed的扩展版本,旨在利用视频终端。
  • vi是一个为ex提供全屏视觉模式的编辑器,与edex使用的面向行的界面形成鲜明对比。

答案 1 :(得分:1)

根据建议,ed

ed file << END
1i
line1
line2
.
wq
END

“点”行表示“输入结束”。

它可以写成不太清晰的单行

printf "%s\n" 1i "line1" "line2" . wq | ed file

答案 2 :(得分:0)

使用sed

如果我理解正确,您想在文件的开头添加两行。在这种情况下,根据Cyrus&#39;建议,运行:

#!/bin/bash
if [ $# -ne 1 ]
then
   echo "USAGE:vitest filename"
   exit 1
fi

sed -i.bak '1 s/^/line1\nline2\n/' "$1"

注意:

  1. 使用shell变量时,除非要执行单词拆分和路径名扩展,否则它应该是双引号。这对于文件名很重要,例如,因为它们现在通常包含空格。

  2. 最佳做法是为shell变量使用较低或混合大小写的名称。系统为其变量使用大写名称,并且您不想意外覆盖其中一个。

  3. 在检查参数时,if语句应包含exit,以防止在未提供参数的情况下运行脚本的其余部分。在上文中,我们添加了exit 1,将退出代码设置为1以表示错误。

  4. 使用vi

    让我们从这个测试文件开始:

    $ cat File
    some line
    

    现在,让我们运行vi,然后查看文件中的内容:

    $ vi -s <(echo $'iline1\nline2\n\eZZ') File
    $ cat File
    line1
    line2
    some line
    

    上述内容需要bash或类似内容。

答案 3 :(得分:0)

使用virtualenv --python=python3.5 myvenv Running virtualenv with interpreter /usr/bin/python3.5 Using base prefix '/usr' New python executable in /home/username/myvenv/bin/python3.5 Also creating executable in /home/username/myvenv/bin/python Traceback (most recent call last): File "/usr/local/bin/virtualenv", line 11, in <module> sys.exit(main()) File "/usr/local/lib/python2.7/dist-packages/virtualenv.py", line 669, in main Traceback (most recent call last): raise SystemExit(popen.wait()) File "/usr/local/lib/python2.7/dist-packages/virtualenv.py", line 2327, in <module> File "/usr/lib/python2.7/subprocess.py", line 1376, in wait pid, sts = _eintr_retry_call(os.waitpid, self.pid, 0) File "/usr/lib/python2.7/subprocess.py", line 476, in _eintr_retry_call return func(*args) KeyboardInterrupt main() File "/usr/local/lib/python2.7/dist-packages/virtualenv.py", line 711, in main symlink=options.symlink) File "/usr/local/lib/python2.7/dist-packages/virtualenv.py", line 944, in create_environment download=download, File "/usr/local/lib/python2.7/dist-packages/virtualenv.py", line 900, in install_wheel call_subprocess(cmd, show_stdout=False, extra_env=env, stdin=SCRIPT) File "/usr/local/lib/python2.7/dist-packages/virtualenv.py", line 767, in call_subprocess line = stdout.readline() KeyboardInterrupt

cat