GNU/Linux >> Linux Esercitazione >  >> Linux

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

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.


Linux
  1. Impedire l'esecuzione simultanea di uno script bash

  2. Come rilevare se la shell è controllata da Ssh?

  3. Script Bash per rimuovere il file più vecchio da una cartella?

  4. Il modo "corretto" per verificare se un servizio è in esecuzione in uno script?

  5. Rileva se il tasto viene premuto dallo script?

Esegue lo script bash dall'URL

Qualsiasi modo per uscire dallo script bash, ma non uscire dal terminale

C'è un modo per mostrare la notifica dallo script bash in Ubuntu?

È possibile recuperare il contenuto di uno script bash in esecuzione dalla RAM

Script Bash per rimuovere il file più vecchio da una cartella

Qual è il modo migliore per verificare se un volume è montato in uno script Bash?