2012-06-03 16 views
5

Mam jeden skrypt powłoki działający w środowisku Windows na środowisku cygwin. Ten skrypt ma jedną funkcję czyszczącą, która usuwa określony folder w bazach systemu w określonych warunkach.Cygwin: różnica między poleceniem " rm -fr" a "rm -fr"?

przygotować listę wszystkich folderu że chcesz usunąć, a następnie użyć polecenia:

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

Teraz gdy testowałem tego skryptu, katalogi nie są coraz usunięte w ogóle. Najpierw myślałem, że jest jakiś problem z listą czyszczenia, ale podczas debugowania dowiedziałem się, że lista czystek jest w porządku.

Po wielu próbach i debugowania Zrobiłem małą zmianę w poleceniu:

\rm -rfv $purge 

to tylko rodzaj przeboju i prób i skrypt zaczyna działać prawidłowo. Teraz, o ile wiem, \ rm i rm -f oba oznaczają wymuszone usuwanie.

Teraz, jak mogę to uzasadnić, dlaczego "rm -f" co teraz działa wcześniej, ale "\ rm -f". Chcę poznać podstawową różnicę między tymi dwoma poleceniami.

Odpowiedz

9

rm może być (teoretycznie) jeden z:

  • wbudowanym poleceniem powłoki (jednak nie znam żadnej powłoki z takiego wbudowanego polecenia)
  • polecenia zewnętrznego (najprawdopodobniej/bin/PP)
  • funkcją powłoki
  • alias

Jeśli umieścisz przed nim \ (lub zacytuj dowolną jej część, na przykład "rm" lub nawet 'r'm) powłoka zignoruje wszystkie aliasy (ale nie funkcje).

Jak wspomniano jlliagre, można zapytać o powłokę, co jest rm i co jest \rm przy użyciu wbudowanego type.

Eksperyment:

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

Teraz mamy alias rm, funkcję rm i oryginalne polecenia zewnętrznego rm: Zobaczmy, jak nazywają siebie:

$ 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 

Aby zrozumieć głęboko , zobacz help builtin, help command, help alias i man sh.

+0

Próbowałem również podać dokładną ścieżkę polecenia rm, jak/usr/bin/rm -fr. Myślę, że to jest równe \ rm -fr ... prawda? popraw mnie jeśli się mylę – dhroove

+0

Jeśli masz/usr/bin/rm pierwszy w PATH i nie masz zdefiniowanej żadnej funkcji rm(), to tak. Zauważ, że w większości systemów rm znajduje się w/bin/(nie/usr/bin /), ponieważ jest to niezbędne polecenie systemowe. –

+0

nawet po użyciu bezwzględnej ścieżki dla polecenia rm w moim skrypcie. Funkcja purgowania nie działała w skrypcie ... Tylko po tym, jeśli użyłeś \ rm, to tylko jego rozpoczęcie pracy .... Czy mamy dobre wyjaśnienie tego. .. Uprzejmie mnie popraw, jeśli gdzieś się zakręcę .. – dhroove

5

To oznacza, że ​​twoje polecenie rm ma alias lub funkcję. Backslashing mówi powłoce, aby użyła prawdziwego polecenia rm.

Edit: Można powiedzieć, co odnosi się do rm z polecenia type, np:

$ type rm 
rm is /bin/rm 

.

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

.

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

, ale kiedy uruchomię to samo polecenie "rm -fr" na terminalu cygwin, aby usunąć katalog i podkatalog, to działa dobrze ... Dlaczego to się dzieje tylko w skrypcie powłoki? :( – dhroove

+0

@dhroove, ponieważ w twoim środowisku cygwin 'rm' nie jest zdefiniowany jako funkcja/alias .. Twoje skrypty startowe różnią się w dwóch środowiskach: –

+0

@WilliamPursell: dwa środowiska wspomniane powyżej mówią o środowisku, w którym uruchamianie skryptów i środowisko, w którym działają terminale cygwin ??? – dhroove

Powiązane problemy