嘿,我如何在脚本中打开 vim?
我需要对编码作业进行评分并编写了一个脚本来打开代码和注释文件,但是 vim 没有打开。
该脚本本质上是一个更高级的版本:
#!/bin/bash
echo -e "$student_files" | while read student do
vim -o $student
done
#each "$student" looks like: "file1 file2 [...] notes"
Run Code Online (Sandbox Code Playgroud)
但是 vim 抱怨:
Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: preserving files...
Vim: Finished.
Run Code Online (Sandbox Code Playgroud)
谁能告诉我为什么会发生这种情况以及我如何解决它?提前致谢 :)
注意:我尝试在没有循环的脚本中运行 vim ,这可行,但我不知道为什么。我想是因为我正在进入一段时间
由于管道的原因,标准输入被重定向到while循环;包括从中启动的任何命令,例如vim.
由于您总是希望从那里的终端获得输入,您只需重新连接到终端即可/dev/tty:
< /dev/tty vim -o "$student"
Run Code Online (Sandbox Code Playgroud)
或者,可以在进入管道 ( )之前将stdin保存到文件描述符中,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
Run Code Online (Sandbox Code Playgroud)
或完全跳过中间数组:
for student in $student_files
do
vim -o "$student"
done
Run Code Online (Sandbox Code Playgroud)