Как проверить, поддерживает ли система на основе Unix определенный параметр в команде (mv -T)

Я работаю над сценарием развертывания, который хочет обновить символическую ссылку атомарно. Я намерен использовать такую ​​команду, как

$ ln -s new current_tmp && mv -Tf current_tmp current

(Благодарю за подробности о том, почему это работает).

Однако не все версии mv поддержать -T вариант. Как я могу достоверно определить, поддерживает ли система это, прежде чем использовать его?

Это лучший способ, чем создать другой файл и попытаться mv этот файл вместо того, чтобы использовать -T вариант (и проверка, если это было успешно), чтобы я мог знать, если текущая система поддерживает эту опцию? Затем я могу запустить правильную команду для этой системы.

Спасибо за вашу помощь.

1 ответ

Решение

В общем можно

  • писать переносимый код, не полагаясь на конкретные расширения, выходящие за рамки того, что будет поддерживать каждый UNIX (который является PITA как -f а также -i опция обязательна для mv и аналогичные ограничения существуют для других утилит...)
  • Большинство людей имеют ограниченный выбор операционных систем и версий, и им не нужно писать действительно универсальные сценарии, просто определите, с какой основной версией вы работаете, в своем инструменте развертывания и действуйте соответствующим образом. Похоже на то, что такой инструмент, как facter уже делает для вас в Puppet.
  • Предположим, что функция присутствует и перехватить ошибку в случае сбоя вашей команды (что вы должны делать в любом случае), а затем вернуться к решению проблемы.
  • предварительно проверьте строку версии команды.
    Если -T или же --no-target-directory Эта особенность относится к GNU coreutils версии mv Вы можете проверить в git, когда он был представлен, найти 2004, а затем определить, что вам нужна версия coreutils, более поздняя, ​​чем 5.2.1, выпущенная двенадцать лет назад.,
Другие вопросы по тегам