In precedenza sono stato frustrato dalle differenze nell'output di which
comando su piattaforme diverse (Linux vs. Solaris vx. OS X), con diverse shell che potrebbero anche giocare nella questione. type
è stato suggerito come un'alternativa migliore, ma quanto sarebbe portatile?
In passato ho scritto funzioni che analizzano l'output di which
e gestire i diversi casi d'uso in cui mi sono imbattuto. Funzionano su tutte le macchine che uso, 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 esempio possibile, supponiamo di dover 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 in particolare deve essere eseguita (AFAIK) con zsh o una versione recente di bash.
Posso contare su type
essere disponibile su tutte le piattaforme? C'è qualche altra alternativa a which
che può rispondere facilmente e in modo coerente alla domanda se è installato un particolare software?
(Se vuoi dare anche spunti specifici relativi all'esempio che ho fatto, va benissimo, ma mi riferisco principalmente al caso generale:qual è il modo più affidabile per scoprire se una cosa particolare è installata su una determinata macchina ?)
Risposta accettata:
Nel 21° secolo, specialmente se stai prendendo di mira macchine che potrebbero avere bash o zsh, puoi contare su type
essere disponibile. (Non esisteva in unice estremamente vecchi, come negli anni '70 o all'inizio degli anni '80.) Non puoi contare sul fatto che il suo output significhi nulla, ma puoi contare sul suo ritorno 0 se c'è un comando con quel nome e diversamente da zero.
which
non è standard ed è inaffidabile nella pratica. type
è l'alternativa consigliata. whereis
soffre degli stessi problemi di which
ed è meno comune. whence
è specifico per ksh e zsh.
Quando ciò è possibile, sarebbe più affidabile verificare l'esistenza di un comando e verificare se il suo comportamento sembra ragionevole. Ad esempio, verifica 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 (tranne cose esotiche come Fortran e SCCS, che sono comunque opzionali). Puoi contare anche sulla maggior parte della versione 3, ma questo non è ancora completamente implementato ovunque. Il supporto della versione 4 è più impreciso. Se hai intenzione di leggere queste specifiche, ti consiglio di leggere la versione 3, che è molto più leggibile e meno ambigua della versione 2.
Correlati:come copiare il layout della partizione di un intero disco utilizzando strumenti standard?
Per esempi su come rilevare le specificità del sistema, guarda autoconf e configure
script di vari software.