Qual è il modo migliore per rilevare (da uno script) se il software è installato?


9

Sono stato frustrato in precedenza con differenze nell'output del whichcomando su piattaforme diverse (Linux vs Solaris vx. OS X), con diverse shell che potrebbero giocare anche sulla questione. typeè stata suggerita come alternativa migliore, ma quanto sarebbe portatile?

In passato ho scritto funzioni che analizzano l'output whiche gestiscono i diversi casi d'uso in cui mi sono imbattuto. Funzionano su tutte le macchine che uso, e quindi vanno bene per i miei script personali, ma questo sembra terribilmente inaffidabile per il software che pubblicherò da qualche parte per essere utilizzato da altri.

Per fare solo un possibile esempio, supponiamo che io debba rilevare da uno script se bash e zsh sono disponibili su una macchina, quindi eseguire un comando con zsh se è presente e con bash se zsh non lo è e bash è sufficiente versione per non avere un bug particolare. La maggior parte del resto dello script potrebbe essere Bourne shell o Ruby o qualsiasi altra cosa, ma questa cosa particolare deve essere fatta (AFAIK) con zsh o una versione recente di bash.

Posso contare sulla typedisponibilità su più piattaforme? Esiste un'altra alternativa a whichcui è possibile rispondere in modo semplice e coerente alla domanda se un particolare software è installato?

(Se vuoi anche dare idee specificamente correlate all'esempio che ho dato, è fantastico, ma principalmente sto solo chiedendo il caso generale: qual è il modo più affidabile per scoprire se una determinata cosa è installata su una determinata macchina ?)

Risposte:


10

Nel 21 ° secolo, specialmente se stai prendendo di mira macchine che potrebbero avere bash o zsh, puoi contare sulla typedisponibilità. (Non esisteva in unici estremamente vecchi, come negli anni '70 o all'inizio degli anni '80). Non puoi contare sul suo output che significhi qualcosa, ma puoi contare sul suo 0 di ritorno se c'è un comando con quel nome e diverso da zero.

whichnon è standard ed è inaffidabile nella pratica . typeè l'alternativa consigliata. whereissoffre degli stessi problemi whiched è meno comune. whenceè specifico per ksh e zsh.

Quando ciò è possibile, sarebbe più affidabile testare l'esistenza di un comando e verificare se il suo comportamento sembra ragionevole. Ad esempio, testare la presenza di una versione adatta di bash eseguendo bash -c 'somecommand', ad es

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

Oggi puoi contare su quasi tutto nella specifica Singe UNIX versione 2 (ad eccezione di cose esotiche come Fortran e SCCS, che sono comunque opzionali). Puoi contare anche sulla maggior parte della versione 3 , ma questa non è ancora completamente implementata ovunque. Il supporto della versione 4 è più sketchier. Se hai intenzione di leggere queste specifiche, ti consiglio di leggere la versione 3, che è molto più leggibile e meno ambigua della versione 2.

Per esempi su come rilevare le specificità del sistema, guarda autoconf e gli configurescript di vari software.

Vedi anche Risorse per la programmazione di shell portatili per ulteriori suggerimenti.


Ciò potrebbe beneficiare di un'espansione per commentare le tecniche comunemente raccomandate utilizzando hashe command -v.
Caleb,

@Caleb Ai fini di questa domanda, non vedo un vantaggio di command -vover type, tutto ciò di cui abbiamo bisogno è un risultato booleano. A quali "tecniche comunemente consigliate si sta usando hash" ti riferisci?
Gilles 'SO- smetti di essere malvagio' il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.