2011-07-26 11 views
5

La versione GNU di rm ha un flag I-cool. Dalla pagina di manuale:Come testare la versione GNU o BSD di rm?

-I  prompt once before removing more than three files, or when removing recursively. Less 
      intrusive than -i, while still giving protection against most mistakes 

Mac non fare:

$ rm -I scratch 
rm: illegal option -- I 
usage: rm [-f | -i] [-dPRrvW] file ... 
    unlink file 

A volte le persone hanno coreutils (la versione GNU) installato su Mac e, a volte non lo fanno. C'è un modo per rilevare questo flag da riga di comando prima di procedere? Mi piacerebbe avere qualcosa di simile nella mia bash_profile:

if [ has_gnu_rm_version ]; then 
    alias rm="rm -I" 
fi 
+0

Ho cambiato il titolo poiché penso che la vera domanda sia "Come posso verificare meglio quale delle due versioni di uno strumento principale che ho?" Non si tratta veramente di Mac contro Linux (più vicino forse è BSD contro Linux, ma anche allora, non è la tua domanda * reale *, penso). – Telemachus

risposta

3

direi che prova l'output di rm -I su un file temporaneo, se passa quindi utilizzare l'alias

touch /tmp/my_core_util_check 

if rm -I /tmp/my_core_util_check > /dev/null 2>&1 ; then 
    alias rm="rm -I" 
else 
    rm /tmp/my_core_util_check; 
fi 
+2

Aggiungerei '2> & 1' al test" rm -I " –

4

Si potrebbe sempre chiedere rm sua versione con --version e controllare per vedere se dice gnu o coreutils come questo:

rm --version 2>&1 | grep -i gnu &> /dev/null 
[ $? -eq 0 ] && alias rm="rm -I" 
+1

Corey: l'esecuzione del predefinito Mac' rm --version' restituisce un messaggio 'opzione illegale --' e lo script termina. –

+0

Modificato per mettere '2> &' dopo il comando 'rm', questo _should_ risolve il problema. Fammi sapere se no. –

0

che ne dici di qualcosa del genere?

#!/bin/bash 
rm -I &> /dev/null 
if [ "$?" == "0" ]; then 
    echo coreutils detected 
else 
    echo bsd version detected 
fi 
+0

Oren: l'ho eseguito su un Mac con entrambe le versioni di 'rm', e lo script pensava che entrambe le versioni fossero la versione BSD. –

+0

@Kevin Gli strumenti GNU sono spesso installati con un prefisso 'g' su Mac, per evitare di calpestare gli strumenti scritti per le versioni BSD. Prova 'grm' forse, anche se vedi la mia risposta sopra. – Telemachus

+1

Inoltre, quando si dice "Lo script pensava entrambe le versioni ...", come hai eseguito questo script contro "entrambe le versioni"? Basta chiamare 'rm' per raccogliere quello che è precedente nel tuo' PATH' (supponendo che siano entrambi chiamati 'rm'. – Telemachus

5

Raccomanderei di non iniziare affatto questa strada. Indirizza i tuoi script in modo che siano il più portabili possibile e affidati solo a flag/opzioni/comportamenti su cui puoi contare. Lo scripting di shell è abbastanza difficile - perché aggiungere più spazio per errori?

Per avere un'idea del tipo di cosa che ho in mente, controlla Ryan Tomayko's Shell Haters talk. Ha anche una pagina molto ben organizzata con collegamenti a POSIX descriptions of shell features and utilities. Ecco rm, ad esempio.

+0

Telemaco: Sto provando a mettere questo in un '.bash_profile' I sync attraverso i miei account su più computer Sarebbe bello usare il flag '-I' se esiste. –

+4

@Kevin - in questo caso, il mio ultimo consiglio: non alias' rm' su nulla. Usa 'rmi 'o qualcos'altro invece. (Vedi i commenti qui per qualche discussione: http: // superuser.it/questions/31171/undo-the-linux-trash-command/31172 # 31172) – Telemachus

+0

OK. Grazie per l'aiuto! –

6

strings /bin/rm | grep -q 'GNU coreutils'

se $? è 0, è coreutils

Problemi correlati