2012-06-03 18 views
5

Tengo un script de shell que se ejecuta en el entorno de Windows en el entorno cygwin. Este script tiene una función de purga que elimina ciertas carpetas en las bases del sistema en ciertas condiciones.Cygwin: diferencia entre el comando ' rm -fr' y 'rm -fr'?

preparo la lista de todas las carpetas que desea eliminar y luego usar siguiente comando:

rm -rfv $purge (where purge is the list of directories I want to delete) 

Ahora cuando probé esta secuencia de comandos, los directorios están no ser eliminado en absoluto. Primero pensé que había algún problema con la lista de depuración, pero en la depuración llegué a saber que la lista de depuración está bien.

Después de un montón de depuración y pruebas que acabo de hacer un pequeño cambio en el comando:

\rm -rfv $purge 

Es sólo una especie de golpe y el ensayo y la escritura comienza a trabajar bien. Ahora, por lo que sé \ rm y rm -f, ambos significan eliminación forzada.

Ahora, ¿cómo puedo justificar esto por qué 'rm -f' lo que ahora funcionaba antes, pero '\ rm -f' lo hizo. Quiero saber la diferencia básica entre estos dos comandos.

Respuesta

9

El rm puede ser (en teoría) uno de:

  • shell orden interna (sin embargo no sé cualquier shell con tal orden interna)
  • comando externo (lo más probable/bin/rm)
  • una función de shell
  • un alias

Si coloca \ antes de ella (o cita alguna parte de ella, por ejemplo "rm" o incluso 'r'm) shell ignorará todos los alias (pero no las funciones).

Como mencionó jlliagre, puede preguntarle a shell qué es rm y qué es \rm usando type built-in.

Experimento:

$ type rm 
rm is /bin/rm 
$ rm() { echo "FUNC"; command rm "[email protected]"; } 
$ type rm 
rm is a function 
$ alias rm='echo ALIAS; rm -i' 
$ type rm 
rm is aliased to `echo ALIAS; rm -i' 

Ahora, tenemos alias rm, la función rm y original comando externo rm: Veamos cómo llamar entre sí:

$ rm # this will call alias, calling function calling real rm 
$ rm 
ALIAS 
FUNC 
rm: missing operand 
$ \rm # this will ignore alias, and call function calling real rm 
FUNC 
rm: missing operand 
$ command rm # this will ignore any builtin, alias or function and call rm according to PATH 
rm: missing operand 

para comprenderla profundamente , vea help builtin, help command, help alias y man sh.

+0

También he intentado dar la ruta exacta del comando rm como/usr/bin/rm -fr. Creo que esto es igual a \ rm -fr ... ¿verdad? Corrígeme si estoy equivocado – dhroove

+0

Si tiene/usr/bin/rm primero en la RUTA y no tiene definida ninguna función rm(), entonces sí. Tenga en cuenta que en la mayoría de los sistemas rm está en/bin/(not/usr/bin /), ya que es un comando esencial del sistema. –

+0

incluso después de usar la ruta absoluta para el comando rm en mi script ... la función de purga no funcionaba en el script ... Solo después de haber utilizado \ rm, solo comienza a funcionar ... ¿Tenemos una buena explicación para esto? .. Por favor, corrígeme si me confundo en alguna parte .. – dhroove

5

Eso significa que su comando rm tiene un alias o una función. Retroceder le dice al shell que use el comando real rm.

Editar: Se puede decir lo que se refiere a rm con el type de comandos, por ejemplo:

$ type rm 
rm is /bin/rm 

.

$ type rm 
rm is aliased to `rm -i' 

.

$ type rm 
rm is a function 
... 
+0

pero cuando ejecuto el mismo comando 'rm -fr' en el terminal cygwin para eliminar el directorio y el subdirectorio, funciona bien ... ¿Por qué está sucediendo solo en el script de shell? :( – dhroove

+0

@dhroove porque en su entorno cygwin, 'rm' no está definido como una función/alias. Sus scripts de inicio son diferentes en los dos entornos. –

+0

@WilliamPursell: dos entornos mencionados anteriormente están hablando del entorno en el que secuencias de comandos y entorno en el que se ejecutan los terminales cygwin? – dhroove

Cuestiones relacionadas