2

我即将编写一个 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。

亲切的问候

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 回答