嘿,我如何在脚本中打开 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 窗口。即使在reset
BS 键之后也只能执行“^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