【问题标题】:Error when using exec vi使用 exec vi 时出错
【发布时间】:2017-02-05 22:01:14
【问题描述】:
#!/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

我正在尝试使用此处的文档和命令通过 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.

【问题讨论】:

  • 我建议使用sed。
  • 不是sed,而是ed 或ex。
  • 使用 cat 这就是它的用途。
  • 我会使用你的建议,但我必须使用 exec vi。
  • 请注意,如果您使用exec,则永远无法到达以下exit 0。你确定你需要exec vi 而不仅仅是vi?

标签: bash shell scripting vi heredoc


【解决方案1】:

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

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

exec 几乎可以肯定是不必要的,尤其是因为您在vi 之后有一个exit 命令。 exec 用于将当前脚本替换为给定的命令;不需要简单地执行命令。


UNIX 文本编辑器简史:

  • ed 是最初的编辑器,设计用于电传打字机而不是视频终端。
  • ex 是 ed 的扩展版本,旨在利用视频终端。
  • vi 是一个为ex 提供全屏可视模式的编辑器,与ed 和ex 使用的面向行的界面形成对比。

【讨论】:

  • 谢谢,exec的解释很有帮助。
【解决方案2】:

按照建议,ed

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

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

它可以写成单行不那么清晰

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

【讨论】:

【解决方案3】:

使用cat。

$ cat file1.txt file2.txt | tee file3.txt
Line 1
Line 2
aaaa
bbbb
cccc

【讨论】:

    【解决方案4】:

    使用 sed

    如果我理解正确,您想在文件开头添加两行。在这种情况下,按照 Cyrus 的建议,运行:

    #!/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 以发出错误信号。

    使用vi

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

    $ cat File
    some line
    

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

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

    以上需要 bash 或类似的。

    【讨论】:

    • 感谢您的提示。我对脚本很陌生,所以这些非常有价值。在这种情况下有没有办法使用 exec vi ?
    • @EstebanRodriguez 好的。我添加了一个vi 解决方案。
    • @John1024,sed 的命令不仅仅是s///:考虑使用i 命令插入行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 2016-09-04
    • 1970-01-01
    • 2022-06-14
    • 2011-05-26
    相关资源
    最近更新 更多