Який найкращий спосіб виявити (зі скрипту), чи встановлено програмне забезпечення?


9

Раніше я був розчарований різницею в whichкоманді на різних платформах (Linux проти Solaris vx. OS X), з різними оболонками, можливо, також і в цьому питанні. typeбуло запропоновано як кращу альтернативу, але наскільки це було б портативно?

Раніше я писав функції, які аналізують вихід whichта обробляють різні випадки використання, в які я зіткнувся. Вони працюють на машинах, які я використовую, і так добре для моїх особистих сценаріїв, але це здається жахливо ненадійним для програмного забезпечення, яке я збираюся розмістити десь для використання іншими.

Якщо взяти лише один можливий приклад, припустимо, я повинен виявити за допомогою скрипту, чи є bash і zsh на машині, а потім запустити команду з zsh, якщо він присутній, і з bash, якщо zsh немає, і bash є достатнім версія не має конкретної помилки. Більшість решти сценарію може бути оболонкою Bourne або Ruby або будь-яким іншим, але це необхідно зробити (AFAIK) або zsh, або останньою версією bash.

Чи можу я розраховувати на typeдоступність на різних платформах? Чи є якась інша альтернатива, за допомогою whichякої можна легко і послідовно відповісти на питання, чи встановлена ​​певна частина програмного забезпечення?

(Якщо ви також хочете дати ідеї, спеціально пов’язані з прикладом, який я подав, це чудово, але я в основному просто запитую про загальний випадок: який найнадійніший спосіб дізнатися, чи певна річ встановлена ​​на даній машині ?)

Відповіді:


10

У 21 столітті, особливо якщо ви орієнтуєтесь на машини, які, ймовірно, мають удар або zsh, ви можете розраховувати на typeдоступність. (Він не існував у надзвичайно старих уніазах, як, наприклад, з 1970-х або початку 1980-х років.) Ви не можете розраховувати на його вихід, який нічого не означає, але ви можете розраховувати на його повернення 0, якщо є команда з цим ім'ям і ненульовий спосіб.

whichне є стандартним і ненадійним на практиці . typeє рекомендованою альтернативою. whereisстраждає від тих же проблем, що whichі рідше. whenceє специфічним для ksh і zsh.

Коли це можливо, було б надійніше перевірити існування команди та перевірити, чи виглядає її поведінка розумною. Наприклад, перевірити наявність підходящої версії bash, запустивши bash -c 'somecommand', наприклад

# Test for the `-v` operator (which appeared in bash 4.2)
if bash -c 'test -v HOME' 2>/dev/null; then 

Сьогодні ви можете розраховувати на майже все у специфікації Singe UNIX версії 2 (крім екзотичних речей, таких як Fortran та SCCS, які в будь-якому разі не є обов'язковими). Ви також можете розраховувати на більшість версії 3 , але це ще не повністю реалізовано скрізь. Підтримка версії 4 - це ескізніше. Якщо ви збираєтеся читати ці характеристики, я рекомендую прочитати версію 3, яка є набагато більш читаною та менш неоднозначною, ніж версія 2.

Для прикладів того, як виявити особливості системи, подивіться на autoconf та configureсценарії різного програмного забезпечення.

Дивіться також Ресурси для портативного програмування оболонок для отримання додаткових порад.


Це може виграти від розширення для коментування загально рекомендованих методів використання hashта command -v.
Калеб

@Caleb Для цього питання я не бачу переваги command -vнад type, все, що нам потрібно, - бульовий результат. Які "загально рекомендовані методи використання hash" ви задумали?
Жил 'ТАК - перестань бути злим'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.