如何在 bash 脚本中打开 vim?

如何在 bash 脚本中打开 vim?

嘿,我如何在脚本中打开 vim?
我需要对编码作业进行评分并编写一个脚本来打开代码和注释文件,但 vim 无法打开。

该脚本本质上是一个更高级的版本:

#!/bin/bash
echo -e "$student_files" | while read student do
   vim -o $student
done

#each "$student" looks like: "file1 file2 [...] notes"

但 vim 抱怨:

Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: preserving files...
Vim: Finished.

谁能告诉我为什么会发生这种情况以及我该如何解决它?提前致谢 :)

笔记:我尝试在脚本中运行 vim没有一个循环,它有效,但我不知道为什么。我想是因为我正在进入 while

答案1

由于管道的存在,标准输入被重定向到while循环;包括从中启动的任何命令,例如vim.

由于您总是希望从那里的终端获取输入,因此您可以重新连接到终端/dev/tty

< /dev/tty vim -o "$student"

或者,标准输入可以在进入管道 ( ) 之前保存到文件描述符exec 6<&0并传递给 Vim ( <&6 vim -o ...)。 (这也可以处理这样的情况:Vim 命令的“宏记录”保存在文件中,并且您希望通过将记录的输入传输回其中来自动化 Vim 本身。)

或者,您可以尝试完全摆脱管道,首先将整个文件内容读入 Bash 数组 ( readarray),然后使用简单的for循环。这会消耗更多内存,但这不应该成为问题,因为限制因素而是你愿意按顺序处理多少个 Vim 会话:-) 实际上,你不是从文件中读取,而是从变量中读取内容(据我所知,学生可能在多行上以空格分隔 - 默认IFS解析会将这些学生分成单独的学生),因此您需要做的很简单分词放入 Bash 数组中:

declare -a students=($student_files)
for student in "${students[@]}"
do
    vim -o "$student"
done

或完全跳过中间数组:

for student in $student_files
do
    vim -o "$student"
done

答案2

]# cat filelist 
fsc
out
]# vim -o $(<filelist)
2 files to edit
]# 

...在这之间我有这两个文件“fsc”和“out”堆叠的在维姆中。

我用过man vim一次。

在测试了你的脚本后,我不得不放弃我的 xterm 窗口。即使在resetBS 键之后也只能执行“^H”。所以我彻底改变了。

答案3

declare -a student_array=()
while read line ; do student_array+=("$line") ; done < <(echo -e "$student_array")
for student in "${student_array[@]}" ; do
  vim -o $student
done

相关内容