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
Статус выхода отличается только в случае сбоя приложения.
В вашем случае я предлагаю вам:
- сохранить текущую сумму md5 в переменную
- открытый Vim
- сохранить текущую сумму md5 в переменную
- сравнить оба
Единственный способ повлиять на статус выхода 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