Shell Script调用vim编辑器,获取exit方法

时间:2013-02-28 09:57:28

标签: shell vim debian exitstatus

我即将编写一个shell脚本来编辑一些文件。

我这样做:

/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 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

退出状态不同于仅在应用程序失败时。

在你的情况下,我建议你:

  1. 将当前md5sum保存到变量
  2. open vim
  3. 将当前md5sum保存到变量
  4. 比较两者

答案 2 :(得分: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