Jaki jest najlepszy sposób na wykrycie (ze skryptu), czy oprogramowanie jest zainstalowane?

9

Byłem sfrustrowany wcześniejszymi różnicami w wynikach whichpolecenia na różnych platformach (Linux vs. Solaris vx. OS X), z różnymi powłokami, które prawdopodobnie również biorą w tym udział. typezostał zaproponowany jako lepsza alternatywa, ale jak by to było przenośne?

W przeszłości pisałem funkcje, które analizują dane wyjściowe whichi obsługują różne przypadki użycia, na które natrafiłem. Działają na różnych komputerach, których używam, więc są w porządku dla moich osobistych skryptów, ale wydaje się to strasznie niewiarygodne w przypadku oprogramowania, które zamierzam zamieścić gdzieś, aby inni mogli z nich korzystać.

Aby wziąć tylko jeden możliwy przykład, załóżmy, że muszę wykryć w skrypcie, czy bash i zsh są dostępne na komputerze, a następnie uruchomić polecenie z zsh, jeśli jest obecny, i z bash, jeśli zsh nie jest, a bash jest wystarczający wersja nie ma określonego błędu. Większość reszty skryptu może być powłoką Bourne'a, Ruby lub czymkolwiek innym, ale ta jedna konkretna rzecz musi zostać wykonana (AFAIK) za pomocą Zsh lub najnowszej wersji bash.

Czy mogę liczyć na typedostępność na różnych platformach? Czy jest jakaś inna alternatywa, na whichktórą można łatwo i konsekwentnie odpowiedzieć na pytanie, czy zainstalowane jest określone oprogramowanie?

(Jeśli chcesz również podać pomysły związane z podanym przeze mnie przykładem, to świetnie, ale pytam głównie o ogólny przypadek: jaki jest najbardziej niezawodny sposób, aby dowiedzieć się, czy konkretna rzecz jest zainstalowana na danym komputerze ?)

ikonoklasta
źródło

Odpowiedzi:

10

W XXI wieku, szczególnie jeśli atakujesz maszyny, które prawdopodobnie mają bash lub zsh, możesz liczyć na typeich dostępność. (Nie istniał w ekstremalnie starych jednorożcach, jak w latach 70. lub wczesnych 80.). Nie możesz liczyć na to, że jego wynik nic nie znaczy, ale możesz liczyć na jego zwrócenie 0, jeśli istnieje polecenie o tej nazwie i niezerowe inaczej.

whichnie jest standardem i jest zawodny . typejest zalecaną alternatywą. whereiscierpi na te same problemy whichi jest mniej powszechny. whencejest specyficzny dla ksh i zsh.

Gdy jest to możliwe, bardziej wiarygodne byłoby przetestowanie istnienia polecenia i sprawdzenie, czy jego zachowanie wygląda rozsądnie. Na przykład przetestuj obecność odpowiedniej wersji basha, uruchamiając bash -c 'somecommand'np

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

Dziś możesz liczyć na prawie wszystko w specyfikacji Singe UNIX w wersji 2 (z wyjątkiem egzotycznych rzeczy, takich jak Fortran i SCCS, które i tak są opcjonalne). Możesz też liczyć na większość wersji 3 , ale nie jest to jeszcze wszędzie zaimplementowane. Obsługa wersji 4 jest bardziej szkicowa. Jeśli masz zamiar przeczytać te specyfikacje, polecam przeczytanie wersji 3, która jest o wiele bardziej czytelna i mniej dwuznaczna niż wersja 2.

Aby dowiedzieć się, jak wykryć specyfikę systemu, zobacz autoconf i configureskrypty różnych programów.

Zobacz także Zasoby dotyczące programowania przenośnych powłok, aby uzyskać więcej wskazówek.

Gilles „SO- przestań być zły”
źródło
Może to przynieść korzyści z rozszerzenia w celu skomentowania powszechnie zalecanych technik przy użyciu hashi command -v.
Caleb
@Caleb Dla celów tego pytania, nie widzę korzyści z command -vprzejęcia type, wszystko czego potrzebujemy to logiczna wynik. Do jakich „powszechnie zalecanych technik hash” korzystasz ?
Gilles „SO- przestań być zły”