テキストを含むシェルスクリプトでエディタを実行する

テキストを含むシェルスクリプトでエディタを実行する

シェルスクリプトでデフォルトエディタを起動できることを知っています。たとえば、$EDITOR環境変数が設定されているとします。

$EDITOR ~/newfile.txt

テキストが事前に入力された新しいファイルを開くことはできますか?私が考えることができる1つの方法は、ファイルを開く前にファイルを作成することです。

echo "Header" > ~/newfile.txt
$EDITOR ~/newfile.txt

しかし、テキストエディタで開いたファイルはあらかじめ入力されていますが、削除することもできれば良いでしょう。可能ですか?

ベストアンサー1

エディタでコンテンツを事前に入力するには、想像通りにこの初期コンテンツをファイルに作成します。

他のエディタに対応するために、「エディタを開いて数行を入力できる状態にする」方法はありません。多くのエディタでは、これはファイルが保存されていないことを意味しますが、この状態を達成する統一された方法はなく、一部のエディタではその概念はまったくありません(例:傷跡)。

ただし、ファイルが保存されているかどうかはエディタで確認できます。ファイルが保存されない場合は、操作を中止してください。ファイルが保存されていることを確認するには、ファイルの前後の変更時間を確認してください。

file=$(mktemp)
cat <<EOF >"$file"
Hello
world
EOF
old_metadata=$(ls -li "$file")
"${VISUAL:-"${EDITOR:-vi}"}" "$file"
new_metadata=$(ls -li "$file")
if [ "$new_metadata" = "$old_metadata" ]; then
  … # unchanged file, abandon operation
else
  … # modified file, carry on
fi

ファイルが変更されたがサイズとinodeが変更されておらず、変更時間が1秒未満の場合、スクリプトはファイルが変更されていないと見なします。人が編集する場合、これは発生しませんが、スクリプトが変更され$EDITORたファイルを自動的にコミットすると簡単に発生する可能性があります。ポータブルな方法でより良い作業を行うことは困難です。 GNU coreutilsを使用すると、ファイルシステムが十分な精度で1秒未満のタイムスタンプをサポートしている場合は、オプションを渡すことで--full-timeこの問題を解決できます。ls

または、ファイルが変更されていることを確認してください。これを行う移植可能な方法は、最初のコンテンツのコピーをアーカイブしてから呼び出すことですcmpsha256sumあるいは、同じコマンドをsha使用できる場合は、そのコマンドを使用して前後のハッシュを比較できます。ファイルのタイムスタンプが変更されても、ファイルが編集されたと思うかもしれません。ユーザーが実際に基本入力を送信したい場合もあります。

多くのバージョン管理システムは、コミットメッセージを編集するためにエディタを起動するときにこの手法を使用します。ユーザーがファイルを保存しないと、送信は中止されます。

カーソルを入力端に配置したい場合は、一般的な方法はありません。多くの編集者と一緒に書くことができます

"$EDITOR" +"$line" "$file"

エディタは指定された行にカーソルがある状態で開きます。 vi(すべてのバリアント)、emacs、joe、geditなど、多くのエディタはこの機能をサポートしていますが、kwriteはサポートしていません。

おすすめ記事