2011-07-26 10 views
5

La versión GNU de rm tiene una bandera I interesante. Desde la página de manual:¿Cómo probar la versión GNU o BSD de 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 no hacer:

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

veces las personas tienen coreutils (la versión GNU) instalado en Macs y otras veces no lo hacen. ¿Hay alguna manera de detectar este indicador de línea de comando antes de continuar? Me gustaría tener algo como esto en mi bash_profile:

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

He cambiado el título ya que creo que la verdadera pregunta es "¿Cómo puedo comprobar cuál de las dos versiones de una herramienta principal que tengo?" En realidad, no se trata de Mac versus Linux (más cercano quizás sea BSD versus Linux, pero incluso entonces, esa no es su pregunta * real *, creo). – Telemachus

Respuesta

3

yo diría que prueba la salida de rm -I en un archivo temporal, si pasa a continuación, utilizar el 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

Acabo de agregar '2> & 1' a la prueba" rm -I " –

4

Usted podría siempre pregunte rm su versión con --version y comprobar para ver si dice GNU o coreutils como esto:

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

Corey: ejecutando el predeterminado Mac' rm --version' produce un mensaje 'illegal option --' y el script termina. –

+0

Editado para poner '2> &' después del comando 'rm', este _debería resolver ese problema. Avísame si no. –

0

¿Qué tal algo así?

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

Oren: ejecuté esto en una Mac con ambas versiones de 'rm', y la secuencia de comandos pensó que ambas versiones eran la versión BSD. –

+0

@Kevin Las herramientas GNU a menudo se instalan con un prefijo 'g' en Macs, para evitar pisar las herramientas escritas para las versiones BSD. Prueba 'grm' tal vez, aunque ve mi respuesta más arriba. – Telemachus

+1

Además, cuando dice "El guión pensaba en ambas versiones ...", ¿cómo ejecutó este guión contra "ambas versiones"? Simplemente llamando a 'rm' recogerá el que esté antes en su' PATH' (suponiendo que ambos se llamen 'rm'. – Telemachus

5

Recomendaría no iniciar en este camino en absoluto. Oriente sus scripts para que sean lo más portátiles posible, y solo confíe en los indicadores/opciones/comportamientos con los que puede contar. Las secuencias de comandos de Shell son suficientemente difíciles: ¿por qué agregar más espacio para el error?

Para tener una idea del tipo de cosas que tengo en mente, consulte Ryan Tomayko's Shell Haters talk. También tiene una página muy bien organizada con enlaces al POSIX descriptions of shell features and utilities. Aquí está rm, por ejemplo.

+0

Telemachus: Estoy tratando de poner esto en '.bash_profile' Sincronizo a través de mis cuentas en varias computadoras. Sería bueno usar la bandera '-I', si existe. –

+4

@Kevin - en ese caso, mi último consejo: No alias' rm' a nada. Utiliza 'rmi 'o algo más en su lugar. (Ver comentarios aquí para un debate: http: // superuser.com/questions/31171/undo-the-linux-trash-command/31172 # 31172) – Telemachus

+0

OK. ¡Gracias por la ayuda! –

6

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

si $? es 0, es coreutils

Cuestiones relacionadas