2

いくつかのファイルを編集するためのシェル スクリプトを作成しようとしています。

私はこのようにやっています:

/usr/bin/vim $file

今、私はvimの終了ステータスを尋ねたい. ユーザーが変更を保存して閉じた場合は何か (:wq または :x)、変更せずに閉じた場合 (:q, :q!) は別のことを行います。

if [ vi-exit-status=wq ] ; then
    # do this
else # vi didn't save anything
    # do that
fi

どうやってやるの?vi を呼び出して新しいファイルを作成し、保存せずに終了すると (:q!)、次の方法でステータスを確認します

echo $?

答えは 0 です。何かを保存したり、vi/vim でファイルを作成したりすると、それも 0 になります。

敬具

4

3 に答える 3

1

終了ステータスは、ユーザーがvimで何をしたかを教えてくれません。おそらく、前後のファイルのタイムスタンプを比較して、それが書き込まれたかどうかを確認できますか?

これは私にとってはうまくいきます:

echo Edit me > editme.txt
time1=`stat -c%y editme.txt`
vim editme.txt
time2=`stat -c%y editme.txt`
if [ "$time1" != "$time2" ]; then
    echo You saved it.
else
    echo No change.
fi
于 2013-02-28T10:02:29.620 に答える
1

終了ステータスは、アプリケーションが失敗した場合のみとは異なります。

あなたの場合、私はあなたに提案します:

  1. 現在の md5sum を変数に保存する
  2. vimを開く
  3. 現在の md5sum を変数に保存する
  4. 両方を比較
于 2013-02-28T10:03:48.167 に答える
0

Vim の終了ステータスに影響を与える唯一の方法は を使用する:cquitことですが、ユーザーは通常それを行いません。

むしろ必要なのは、ファイルが Vim によって変更されたかどうかを示すことです。これを行うには、次のBash スニペットのように、編集の前後に変更時間を確認します。

EDIT=/path/to/file.txt
MODTIME=$(stat -c %Y "$EDIT")
"$EDITOR" "$EDIT" || { echo 2>&1 "Unclean exit of editor; aborting!"; exit $?; }
NEWMODTIME=$(stat -c %Y "$EDIT")

if [ $NEWMODTIME -eq $MODTIME ]; then
    echo "No changes done."
    exit 0
fi
于 2013-02-28T10:17:20.880 に答える