파일이 변경되었는지 확인하는 기능

파일이 변경되었는지 확인하는 기능

그래서 이 함수를 사용하여 파일이 수정되었는지 확인하는 함수를 만들려고 합니다.

~ 에 누워 있다 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 

관련 정보