检查文件是否已更改的函数

检查文件是否已更改的函数

所以我试图创建一个函数来检查文件是否已使用此函数修改:

位于functions.zsh

changed() {
  echo "$1"
  if [ -f "$1_changed" ]; then
    if [ stat -f "%Z" != $(<"$_changed") ]; then
      return 1
    else
      return 0
    fi
  else
    stat -f "%Z" "$1" > "$1_changed"
    return 1
  fi

}

当前的用例是这样的:

位于load_plugins.sh

if [ changed("plugins") -eq 1]; then
  echo "plugin file updated, installing plugins"
  antibody bundle < "$plugin_file" > "$installed_plugins"
  if [[ $OSTYPE == *darwin* ]];then
    antibody bundle robbyrussell/oh-my-zsh folder: lib/clipboard >> "$installed_plugins"
  fi
fi

两者的来源如下:

位于~/.zshrc

base_path="$HOME/.zsh"
config_path="$base_path/config"

source "$custom_path/functions.zsh"
source "$config_path/load_plugins.zsh" "$config_path"

问题是我收到此错误:

load_plugins.zsh:7: number expected

这是这一行:

if [ changed("plugins") -eq 1]; then

我还注意到,如果我放置:

echo changed("plugins")

前:

if [ changed("plugins") -eq 1]; then

终端上没有打印任何内容,我在echo其中changed()检查该功能是否正常工作也是如此。

我究竟做错了什么?

编辑:

到目前为止我所做的更改:

changed() {
  echo "$1"
  if [ -f "$1_changed" ]; then
    if [ "$(stat -f \"%Z\")" != "$(<"$1_changed")" ]; then
      return 1
    else
      return 0
    fi
  else
    "$(stat -f "%Z" "$1")" > "$1_changed"
    return 1
  fi

}

完成工作版本

changed () {
  local timestamp="$(stat -f %Z "$1")"

  if [ ! -f "$1_changed" ] ||  [ "$timestamp" != "$(<"$1_changed")" ]; then
    current="$(<"$1_changed")"
    printf '%s\n' "$timestamp" >"$1_changed"
  fi

  [ "$timestamp" != "${current:-$(<"$1_changed")}" ]
}

答案1

您更新的函数,在调用中使用更正的引号stat(引号将被输出,并且稍后针对文件内容的测试将具有总是由于他们而失败):

changed() {
  echo "$1"
  if [ -f "$1_changed" ]; then
    if [ "$(stat -f "%Z")" != "$(<"$1_changed")" ]; then   # escaped quotes removed
      return 1
    else
      return 0
    fi
  else
    "$(stat -f "%Z" "$1")" > "$1_changed"      # note: error here
    return 1
  fi

}

这可以大大缩短为:

changed () {
  echo "$1"

  if [ ! -f "$1_changed" ]; then
    stat -f %Z "$1" >"$1_changed"
    return 1
  fi

  [ "$(stat -f %Z)" != "$(<"$1_changed")" ]
}

在这里,我还改变了一个命令替换,它将运行输出stat直接调用,stat重定向到输出文件(参见error here第一段代码中的注释)。

我还更改了函数的逻辑,以便不需要那么多return调用。如果没有return,函数的退出状态将是函数中最后一条语句的退出状态。

我们可以让这个稍微整洁一些

changed () {
  echo "$1"

  local timestamp="$(stat -f %Z "$1")"

  if [ ! -f "$1_changed" ]; then
    printf '%s\n' "$timestamp" >"$1_changed"
    return 1
  fi

  [ "$timestamp" != "$(<"$1_changed")" ]
}

稍后,您可以使用以下方式调用此函数

if changed "$filename"; then
    # do something, the file in "$filename" changed
fi

请注意,您的电话,

if [ changed("plugins") -eq 1]; then

有几个语法错误。

答案2

消除四个错误

 if [ stat -f "%Z" != $(<"$_changed") ]; then

哪个是:

  • 使用“命令替换”$(...)
  • 更改stat -f-c选项
  • 添加文件名 ( $1) stat(稍后也在下游!)
  • 使用正确的文件名$1

屈服

 if [ $(stat -c "%Z" "$1") != $(<"$1_changed") ]; then 

相关内容