Jaki jest prawdziwy sens opcji -f na rm?

14

Po przeczytaniu strony podręcznika GNU coreutils rm, jedną z opcji jest -f, która zgodnie z instrukcją,

-f, --force
          ignore nonexistent files and arguments, never prompt

Teraz przeprowadziłem kilka testów i pokazałem, że rzeczywiście, jeśli użyję czegoś takiego

rm -f /nonexisting/directory/

nie będzie narzekać.

Co ktoś może naprawdę zyskać na takiej opcji?

Ponadto najczęstsze przykłady użycia „usuwania katalogów” rmto coś w rodzaju

 rm -rf /delete/this/dir

Ta -ropcja ma sens, ale -f?

saliarosaurus
źródło

Odpowiedzi:

9

Uważam, że w tej stronie podręcznika brakuje drobnych szczegółów. -fOpcja rmrzeczywiście ma sporo przypadków użycia:

  • Aby uniknąć błędu kodu wyjścia
  • Aby uniknąć monitu
  • Aby ominąć kontrole uprawnień

Masz rację, że nie ma sensu usuwać nieistniejącego pliku, ale w skryptach wygodnie jest móc powiedzieć: „Nie chcę tych plików, usuń je, jeśli je znajdziesz, ale nie zawracaj mi głowy, jeśli nie „istnieje”. Niektóre osoby używają set -eskryptu, aby zatrzymał się na każdym błędzie (aby uniknąć dalszych szkód, jakie skrypt może spowodować) i rm -rf /home/my/garbagejest łatwiejszy niż if [[ -f /home/my/garbage ]]; then rm -r /home/my/garbage; fi.

Uwaga na temat sprawdzania uprawnień: aby usunąć plik, musisz mieć uprawnienia do zapisu do katalogu nadrzędnego , a nie do samego pliku. Powiedzmy, że rootw twoim katalogu domowym znajduje się plik należący do Ciebie i nie masz sudodostępu, nadal możesz go usunąć za pomocą -fopcji. Jeśli używasz Git, możesz zobaczyć, że Git nie pozostawia uprawnień do zapisu w tworzonych plikach obiektowych:

-r--r--r-- 1 phunehehe phunehehe 62 Aug 31 15:08 testdir/.git/objects/7e/70e8a2a874283163c63d61900b8ba173e5a83c

Więc jeśli używasz rm, jedynym sposobem na usunięcie repozytorium Git bez użycia rootjest użycie rm -rf.

phunehehe
źródło
4
-fnie omija kodu wyjścia błędu. Jeśli rmpróba usunięcia istniejącego pliku nie powiedzie się, zwróci kod błędu.
Gilles „SO- przestań być zły”
Głosowałem za odpowiedzią, ponieważ „Aby uniknąć błędu kodu wyjścia” należy napisać jako „Aby uniknąć błędu kodu wyjścia w przypadku, gdy nie ma operandów plików lub operandy plików nie istnieją”. Ponieważ ta odpowiedź jest teraz napisana, jest błędna.
Harold Fischer,
6

Ta -fopcja pomija monity o potwierdzenie podczas usuwania pliku tylko do odczytu. Pomija także błędy, gdy co najmniej jeden dostarczony plik nie istnieje.

Ta -fopcja jest przydatna, gdy zdajesz sobie sprawę, że niektóre usuwane pliki mogą być tylko do odczytu i nie chcesz otrzymywać monitów.

Ta fopcja jest również przydatna, gdy chcesz usunąć niektóre pliki, jeśli istnieją, i nie chcesz się martwić, czy istnieją. Jest to bardzo często używane w plikach makefiles , aby wykonać polecenie, które usuwa pliki, które można ponownie wygenerować z plików źródłowych. Na przykład, foo.omogą zostać odtworzone z foo.c, bar.omogą zostać odtworzone z bar.ci myappmogą zostać odtworzone z foo.oa bar.o, a potem w celu makefile

clean:
        rm -f *.o myapp

usuwa myapp, foo.oa bar.ojeśli istnieją i nie narzeka, jeśli żaden z nich nie istnieje.

W -fwiększości przypadków dołączenie instrukcji usuwania drzewa katalogów nie jest konieczne. Można to uzasadnić, ponieważ jeśli jesteś pewien, że chcesz usunąć to drzewo katalogów niezależnie od tego, co w nim jest, możesz określić, -faby uniknąć monitowania w przypadku, gdy niektóre pliki są tylko do odczytu. Jednak ludzie, którzy mówią, aby uciec, rm -rfczęsto powtarzają mistyczne zaklęcie, aby się czegoś pozbyć, niezależnie od tego, czy opcje -ri -fsą rzeczywiście konieczne. Jeśli opcje nie są konieczne, nie są wskazane, ponieważ zwiększają ryzyko, że literówka w argumencie zniszczy coś ważnego.

Gilles „SO- przestań być zły”
źródło
3

-iPrzełącznikrm

Zazwyczaj widzę, że -fjest używany, rmgdy rmpolecenie jest aliasowane, więc zawiera -iprzełącznik do interaktywnego. -fPrzełącznik przeciwdziała -i.

Przykład

Symuluj problem z rmaliasami do rm -i.

$ alias rm='rm -i'

Zrób fałszywe dane

$ touch afile

Teraz spróbuj go usunąć, używając wersji aliasów rm

$ rm afile 
rm: remove regular empty file `afile'?

Teraz spróbuj użyć -f

$ rm -f afile 
$

Uprawnienia

Sądzę również, że istnieją przypadki, w których masz dostęp tylko do odczytu do katalogu, a gdy spróbujesz usunąć pliki i / lub podkatalogi z tego katalogu, pojawi się podobne pytanie „jesteś pewien?”. Wykorzystanie -fpozbywa się konieczności powiedzenia „tak”.

slm
źródło
Używanie aliasu ma sens. Twoja odpowiedź pasuje do tego, co właśnie pokazałem na stronach podręcznika openbsd. Chociaż openbsd nie jest GNU / Linux, wydaje się, że opisuje to, co właśnie powiedziałeś. Oto link, jeśli ktoś chciałby to sprawdzić: [link] openbsd.org/cgi-bin/…
saliarosaurus
Dzięki bash zawsze możesz \rmuruchomić bez aliasingu (\ jest skrótem do commandwbudowanego). Uważam, że najlepiej nadają się do -fskryptowania powłoki, gdzie masz coś takiego, jak plik blokujący, który może istnieć lub nie, -fzatrzymuje rm: cannot remove 'file': No such file or directoryostrzeżenie.
Drav Sloan,
@DravSloan Tak, to też ma sens. Dziękuję za odpowiedzi zarówno Drav Sloan, jak i slm
saliarosaurus
Używam rm -fczęsto na cleancelu w Makefiles
Alex
-itak naprawdę nie -fo to chodzi, to raczej przypadek na krawędzi.
Gilles „SO- przestań być zły”