Как проверить, поддерживает ли система на основе 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, выпущенная двенадцать лет назад.,