Shell Script вызывает vim editor, получает метод выхода

Я собираюсь написать сценарий оболочки для редактирования некоторых файлов.

Я делаю это так:

/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.

С уважением

3 ответа

Решение

Статус выхода не говорит вам, что пользователь сделал в 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

Статус выхода отличается только в случае сбоя приложения.

В вашем случае я предлагаю вам:

  1. сохранить текущую сумму md5 в переменную
  2. открытый Vim
  3. сохранить текущую сумму md5 в переменную
  4. сравнить оба

Единственный способ повлиять на статус выхода 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
Другие вопросы по тегам