こんにちは、スクリプトで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を実行しようとしています。いいえループはうまくいきますが、理由がわかりません。久しぶりに入るからそういう気がします
答え1
パイプがあるため、標準入力はwhile
ループで実行されるすべてのコマンドを含むループにリダイレクトされますvim
。
常に端末から入力を受けたいので、端末に再接続できます/dev/tty
。
< /dev/tty vim -o "$student"
または、標準入力Pipe() を入力する前に、ファイル記述子に保存してexec 6<&0
Vim( <&6 vim -o ...
) に渡すことができます。 (また、Vimコマンドの「マクロ記録」がファイルに保存されており、記録された入力を再び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」という2つのファイルがあります。積み上げウィムから。
man vim
一度使ってみました。
スクリプトをテストした後、xtermウィンドウを放棄する必要がありました。 BSキー以降もreset
「^ 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