所以我试图创建一个函数来检查文件是否已使用此函数修改:
位于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