2012-06-03 18 views
5

Ho uno script di shell in esecuzione su ambiente Windows in ambiente cygwin. Questo script ha una funzione di eliminazione che elimina determinate cartelle sulle basi del sistema in determinate condizioni.Cygwin: differenza tra il comando ' rm -fr' e 'rm -fr'?

preparo la lista di tutte le cartelle che voglio eliminare e quindi utilizzare il comando seguente:

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

Ora, quando ho provato questo script, le directory non sono essere eliminati del tutto. Per prima cosa ho pensato che ci fosse qualche problema con la purge list, ma sul debug mi sono reso conto che l'elenco di purge va bene.

Dopo un sacco di debug e le prove che ho appena fatto piccolo cambiamento al comando:

\rm -rfv $purge 

E 'solo una specie di colpo e prova e sceneggiatura inizia a lavorare bene. Ora per quanto ne so \ rm e rm -f significano entrambi eliminazione forzata.

Ora, come posso giustificare questo perché 'rm -f' cosa funziona in precedenza ma '\ rm -f' sì. Voglio sapere la differenza di base tra questi due comandi.

risposta

9

Il rm può essere (in teoria) una delle:

comando incorporato
  • guscio (comunque non so qualsiasi shell con tale built-in)
  • comando esterno (molto probabilmente/bin/rm)
  • una funzione di shell
  • un alias

Se si inserisce \ prima di esso (o ne si specifica una parte, ad esempio "rm" o anche 'r'm), la shell ignorerà tutti gli alias (ma non le funzioni).

Come menzionato jlliagre, è possibile chiedere a shell cosa è rm e cosa è \rm utilizzando type incorporato.

Esperimento:

$ 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' 

Ora, abbiamo alias rm, la funzione rm e originale comando esterno rm: Vediamo come chiamare l'un l'altro:

$ 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 

di comprenderla a fondo , vedere help builtin, help command, help alias e man sh.

+0

Ho anche provato a dare il percorso esatto del comando rm come/usr/bin/rm -fr. Penso che questo sia uguale a \ rm -fr ... giusto ?? correggimi se ho torto – dhroove

+0

Se hai/usr/bin/rm prima nel PATH e non hai alcuna funzione rm() definita, allora sì. Si noti che sulla maggior parte dei sistemi rm si trova in/bin/(non/usr/bin /), poiché è un comando di sistema essenziale. –

+0

anche dopo aver usato il percorso assoluto per il comando rm nel mio script .. la funzione di eliminazione non funzionava nello script ... Solo dopo aver usato \ rm quindi solo il suo inizio di lavoro .... Abbiamo una buona spiegazione per questo. .. Gentilmente correggimi se mi sto confondendo da qualche parte .. – dhroove

5

Ciò significa che il comando rm è alias o una funzione. Il backslashing indica alla shell di usare il comando rm reale.

Edit: Si può dire quello che si riferisce alla rm con il type comando, per esempio:

$ type rm 
rm is /bin/rm 

.

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

.

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

ma quando eseguo lo stesso comando 'rm -fr' sul terminale cygwin per eliminare directory e sottodirectory, allora funziona bene ... Che motivo sta accadendo solo in shell script? :( – dhroove

+0

@dhroove perché nel tuo ambiente cygwin, 'rm' non è definito come una funzione/alias.I tuoi script di avvio sono diversi nei due ambienti. –

+0

@WilliamPursell: due ambienti che hai menzionato sopra stai parlando dell'ambiente in cui script eseguito e ambiente in cui vengono eseguiti i terminali cygwin ??? – dhroove

Problemi correlati