как make-файл может обнаружить, доступна ли команда в локальной машине?

X-сервер перестанет работать, если Вы уничтожите основной процесс сессии, и все другие X-клиенты умрут, когда они потеряют соединение с X-сервером.

Под Gnome (по крайней мере, в соответствии с Ubuntu 10.04), процесс сессии gnome-session. Если Вы не используете настольную среду, процесс, который Вы хотите, является менеджером сеансов, или если Вы не работаете один, менеджер окон. Более точно процесс, который необходимо уничтожить, является первым клиентом, который соединился с X-сервером.

11
14.01.2012, 03:51
4 ответа

Возможные команды для генерации контрольной суммы

К сожалению, нет никакой стандартной утилиты для генерации криптографической контрольной суммы. Существует стандартная утилита для генерации CRC: cksum; это может быть достаточно для Вашей цели обнаружить изменения в невраждебном окружении.

Я рекомендовал бы использовать SHA1, а не MD5. Нет многих систем, которые имеют утилиту MD5, но № SHA1, и если Вы собираетесь использовать криптографические контрольные суммы, Вы могли бы также использовать алгоритм без известного метода для нахождения коллизий (предполагающий, что Вы также проверяете размер).

Один инструмент это не стандартно, но распространено и может вычислить, обзоры OpenSSL. Это доступно для Cygwin, Debian и OSX, но к сожалению не части стандартной установки на OSX.

openssl dgst -sha1

На OSX 10.6 существует a shasum утилита, которая также присутствует на Debian (это - часть perl пакет) и я верю на Cygwin также. Это - сценарий Perl. Большинству систем Unix установили Perl, таким образом, Вы могли связать тот сценарий вместе со своим make-файлом, если Вы волнуетесь по поводу этого сценария, не являющегося доступным везде.

Выбор правильной команды для системы

Хорошо, скажем, Вы действительно не можете найти команду, которая работает везде.

В оболочке

Используйте type встроенный, чтобы видеть, доступна ли команда.

sum=
for x in sha1sum sha1 shasum 'openssl dgst -sha1'; do
  if type "${x%% *}" >/dev/null 2>/dev/null; then sum=$x; break; fi
done
if [ -z "$sum" ]; then echo 1>&2 "Unable to find a SHA1 utility"; exit 2; fi
$sum *.org

GNU делает

Можно использовать shell функционируйте для выполнения отрывка оболочки, когда make-файл загружается, и сохраните вывод в переменной.

sum := $(shell { command -v sha1sum || command -v sha1 || command -v shasum; } 2>/dev/null)
%.sum: %
        $(sum) $< >$@

Портативный (POSIX) делают

Можно только выполнить команды оболочки в правиле, таким образом, каждое правило, которое вычисляет контрольную сумму, должно содержать код поиска. Можно поместить отрывок в переменную. Помните, что отдельные строки в правилах оценены независимо. Также помните это $ к знакам, которые должны быть переданы оболочке, нужно оставить $$.

determine_sum = \
        sum=; \
        for x in sha1sum sha1 shasum 'openssl dgst -sha1'; do \
          if type "$${x%% *}" >/dev/null 2>/dev/null; then sum=$$x; break; fi; \
        done; \
        if [ -z "$$sum" ]; then echo 1>&2 "Unable to find a SHA1 utility"; exit 2; fi

checksums.dat: FORCE
    $(determine_sum); \
    $$sum *.org
7
27.01.2020, 19:58
  • 1
    я должен был использовать -P опция type управляйте для получения, "GNU делают" метод описанным выше для работы правильно, таким образом, я закончил с sum := $(shell { type -P sha1sum || type -P sha1 || type -P shasum; } 2>/dev/null). –  Sean 27.03.2015, 07:08
  • 2
    @Sean спасибо за отчет об ошибках. type -P только работы, если Ваша оболочка является ударом, не, если это, например, ksh или тире (который имеет место на Ubuntu среди других). Можно использовать command -v для мобильности. –  Gilles 'SO- stop being evil' 27.03.2015, 10:32
  • 3
    Кажется, что Вы переключились от использования type к использованию command. Другие методы должны быть обновлены также? –  Sean 27.03.2015, 18:30
  • 4
    Кажется, что Вы переключились от использования type к использованию command. Другие методы должны быть обновлены также? –  Sean 27.03.2015, 18:30
  • 5
    @Sean, другие методы прекрасны: type корректный, портативный способ протестировать присутствие команды, проблема с ним состоит в том, что оно производит вывод как sha1sum is /usr/bin/sha1sum вместо просто названия программы. Это было единственным местом, где я использовал вывод type вместо просто его возвращаемого значения. –  Gilles 'SO- stop being evil' 27.03.2015, 19:12

Это - что-то вроде взлома, но Вы могли протестировать, существует ли каждый, и выполните их, если они делают:

[ -x "`which md5 2>/dev/null`" ] && md5 newfile >>sums
[ -x "`which md5sum 2>/dev/null`" ] && md5sum newfile >>sums

Я совершенно уверен, cygwin распознает команды (включая md5sum) без .exe, но включайте его, если Вы имеете к.

5
27.01.2020, 19:58
  • 1
    which значения выхода не являются портативными. Использовать type вместо этого (и Вы, вероятно, хотите использовать if; then; elif чтобы не иметь проблемы там несколько исполняемых файлов). which и type только ищите исполняемые файлы так или иначе, таким образом, Ваш тест с-x бессмыслен. –  Chris Down 13.01.2012, 09:00
  • 2
    больше при использовании "типа": $ cmd= (для cmd в панели md5 md5sum нечто; действительно введите $cmd>/dev/null 2> &1 && $cmd эха && повреждение; сделанный); $cmd file1 file2 file3> md5.txt –  michael 14.01.2012, 02:00

Так как Вы выполняете emacs, затем Вы могли использовать сам emacs для вычислений контрольных сумм: http://www.gnu.org/software/emacs/manual/html_node/elisp/MD5-Checksum.html.

2
27.01.2020, 19:58

Любой GNU автоинструменты (как упомянуто в комментарии), или также CMake является опцией.

Автоинструменты GNU являются более традиционным подходом, но (и возможно разговор только за меня) я не думаю, что люди действительно слишком взволнованы перспективой начальной установки проекта с помощью них. Ну, это - кривая обучения в любом случае. CMake является более новым ребенком на блоке, и возможно менее распространенный (и все еще имеет кривую обучения). Это имеет свой собственный синтаксис, и это генерирует make-файлы для Вашей платформы. CMake делает имеет явное преимущество того, чтобы быть не так un*x-centric; это работает надежно над Unix, окнами и Mac также (например, это может генерировать msvc проекты, например, вместо make-файлов.)

Править: и конечно так как 'make-файлы' были предложены, этот ответ соглашается с тем предположением. Но возможно просто сценарий Python или (удушье) простая программа Java более подходили бы для этой задачи; сценарии/язык программирования сделали бы это то же через платформы.

1
27.01.2020, 19:58

Теги

Похожие вопросы