ファイルが変更されたことを確認する機能

ファイルが変更されたことを確認する機能

したがって、この関数を使用してファイルが変更されたことを確認する関数を作成しようとしています。

〜に横たわっている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

2つのソースは次のとおりです。

横になる~/.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

4つの間違いを取り除く

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

どれ:

  • 「コマンドの置き換え」を使用してください$(...)
  • オプションstat -fに変更-c
  • addfilename( $1) stat(後でダウンストリームになります!)
  • 正しいファイル名を使用してください$1

生産する

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

関連情報