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を実行しようとしています。いいえループはうまくいきますが、理由がわかりません。久しぶりに入るからそういう気がします

ベストアンサー1

パイプがあるため、標準入力はwhileループで実行されるすべてのコマンドを含むループにリダイレクトされますvim

常に端末から入力を受けたいので、端末に再接続できます/dev/tty

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

または、標準入力Pipe() を入力する前に、ファイル記述子に保存してexec 6<&0Vim( <&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

おすすめ記事