使用 exec vi 时出错

Error when using exec vi

#!/bin/bash

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

FILENAME=

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

如果我没理解错的话,你想在文件的开头添加两行。在这种情况下,根据赛勒斯的建议,运行:

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

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

备注:

  1. 当使用shell变量时,它应该用双引号引起来,除非你想进行分词和路径扩展。这对于文件名很重要,例如,因为现在文件名包含空格很常见。

  2. 最好为 shell 变量使用小写或混合大小写名称。系统为其变量使用大写名称,您不希望不小心覆盖其中之一。

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

使用vi

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

$ cat File
some line

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

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

以上要求 bash 或类似。

使用cat

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

按照建议,ed

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

"dot" 行表示 "end of input"。

它可以写成一行,不太清晰

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

您想以 ex 模式启动 vi,并对脚本进行一些小的更改。

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

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


UNIX 文本编辑器简史:

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