Intereting Posts
Была ли заменена ntpd OpenBSD на другие BSD? Или Linux? Обновление OpenJDK в RHEL 6 Маршрутизация VPN-соединений через VPN Как монтировать диск при запуске в Ubuntu? Инструмент Диски не работает Найти все файлы (включая библиотеки), которые зависят от Два массива имеют немного другой размер массива с одинаковыми размерами дисков / разделов, почему? Запуск скрипта каждые 30 минут с помощью crontab с использованием ROOT (Debian) Запуск Darktable под Xfce с использованием определенного стиля / темы цвета Shell Scripting: как использовать часть пути к файлу в качестве имени файла? Использование нескольких независимых экземпляров Thunderbird Показать символ в позиции в файле Как разместить сайт локальной сети, недоступный за пределами локальной сети? Каков общий формат ключевого слова для привязок ключей в файле «inputrc»? проблема чтения и сравнения файлов с использованием вложенных циклов Вставка текста в начале файла с помощью sed через терминал в Linux

Функция, чтобы проверить, был ли файл изменен

поэтому я пытаюсь создать функцию, которая будет проверять, был ли файл изменен с помощью этой функции:

находится в functions.zsh :

 changed() { echo "$1" if [ -f "$1_changed" ]; then if [ stat -f "%Z" != $( "$1_changed" return 1 fi } 

Текущий вариант использования:

находится в load_plugins.sh :

 if [ changed("plugins") -eq 1]; then echo "plugin file updated, installing plugins" antibody bundle  "$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" return 1 fi } 

Законченная рабочая версия

 changed () { local timestamp="$(stat -f %Z "$1")" if [ ! -f "$1_changed" ] || [ "$timestamp" != "$(<"$1_changed")" ]; then current="$("$1_changed" fi [ "$timestamp" != "${current:-$(<"$1_changed")}" ] } 

Ваша обновленная функция с исправленными кавычками в обращении к 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 в первом fragmentе кода).

Я также изменил логику функции, чтобы не нужно было так много 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 

имеет несколько синтаксических ошибок.

Устранить четыре ошибки в

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

которые:

  • используйте "подстановку команд" $(...)
  • изменить параметр stat -f на -c
  • добавьте имя файла ( $1 ) для stat (позже и в дальнейшем!)
  • используйте правильное имя файла с $1

получая

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