したがって、この関数を使用してファイルが変更されたことを確認する関数を作成しようとしています。
〜に横たわっている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