그래서 이 함수를 사용하여 파일이 수정되었는지 확인하는 함수를 만들려고 합니다.
~ 에 누워 있다 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
- addfilename(
$1
)stat
(나중에 다운스트림도 됩니다!) - 올바른 파일 이름을 사용하세요
$1
생산하다
if [ $(stat -c "%Z" "$1") != $(<"$1_changed") ]; then