Piszę plik makefile, który wyczyści niektóre bezużyteczne pliki na końcu kompilacji. Jeśli cel został już utworzony, oczywiście pominie go, a zbędnego pliku może nie być. Więc jeśli to zrobię:
rm lexer.ml interpparse.ml interpparse.mli
Mogę wyświetlać błędy, ponieważ jeden z plików nie istnieje. Czy jest jakiś sposób rm
na zignorowanie tych plików?
Podczas czytania strony podręcznika widzę następującą opcję:
-f Attempt to remove the files without prompting for confirma-
tion, regardless of the file's permissions. If the file does
not exist, do not display a diagnostic message or modify the
exit status to reflect an error. The -f option overrides any
previous -i options.
To brzmi prawie tak, jak chcę, ale tak naprawdę nie jestem pewien co do części dotyczącej uprawnień. Czy jest na to sposób?
rm
w piaskownicy? Wygląda na to, że-f
robi dokładnie to, co chcesz, niezależnie od globowania.-f
nadal próbował je usunąć. To zawiedzie. Nie powie ci, że to się nie udało. Przydatne, jeśli nazwa pliku to zmienna lub glob.rm --interactive=never
takie działanie,rm -f
z wyjątkiem tego, że zwraca status wyjścia błędu. zobacz tutaj po więcej szczegółów: unix.stackexchange.com/questions/72864/…Odpowiedzi:
Ta
-f
opcja jest zdecydowanie tym, czego chcesz używać.Potwierdzenie uprawnień do plików, do których się odnosi, jest następujące:
Więc
rm
ostrzeże Cię, jeśli spróbujesz usunąć plik nie masz uprawnień do zapisu na. Jest to dozwolone, jeśli masz uprawnienia do zapisu w katalogu, ale jest to trochę dziwne, dlategorm
zwykle ostrzega o tym.źródło
-i
.set -e
we wszystkich moich skryptach bash, aby skrypt zakończył działanie po wystąpieniu błędu dowolnego polecenia. Często chcę, aby skrypt informował mnierm
o błędzie, ale i tak kontynuuję. trwa.Innym rozwiązaniem jest to: https://stackoverflow.com/questions/11231937/bash-ignoring-error-for-a-particular-command
Wystarczy dodać polecenie OR po swoim poleceniu:
W ten sposób, gdy instrukcja nr 1 zawiedzie (wyrzuca błąd), uruchom instrukcję nr 2, która jest po prostu
true
.źródło
rm -rf my/dir ||:
jeszcze bardziej zwięźle (:
skróttrue
)Jestem spóźniony na imprezę, ale używam tego cały czas. W makefile dodaj
-
na początku linii, aby zignorować wartość zwracaną przez tę linię. Tak jak:źródło
Jeśli nie chcesz używać opcji -f, alternatywą jest:
To po prostu zapobiegnie drukowaniu błędów.
źródło
Jeśli znajdziesz sposób na zgranie nazw plików,
rm
nie będziesz narzekać, jeśli nie będzie w stanie znaleźć dopasowania. Więc coś takiegolexer.m* interpparse.*
, itp. Powinno działać na ciebie (uważaj, aby nie usunąć zbyt wiele, oczywiście). Ponadto-f
jest to całkowicie rozsądna droga, o ile nie masz nadziei, że uprawnienia do plików uratują cię przed usunięciem pliku, którego nie chciałeś - jeśli nie chcesz go usunąć, nie umieszczaj go na liście.źródło
sudo rm -rf
.lexer.m?
...? To by złapałolexer.ml
ilexer.mz
, ale nielexer.mll
lublexer.mla
.Opcja -f oznacza, że nie pojawi się monit, jeśli coś nie jest zgodne z oczekiwaniami. Nie oznacza to, że uprawnienia nie są brane pod uwagę.
Jeśli nie masz wystarczających uprawnień do usunięcia pliku, nie zostanie on usunięty.
ALE , jeśli masz wystarczające uprawnienia do zmiany uprawnień, plik zostanie usunięty. Jest tak w przypadku, gdy jesteś właścicielem pliku z uprawnieniami tylko do odczytu dla właściciela (-r --------). Jako właściciel możesz
chmod u+w
, a następnie usunąć:rm -f
usunie ten plik.źródło
Może może pomóc linia podobna do:
Wiem, że to nie jest zbyt mądre, ale spełnia swoje zadanie.
źródło
Alternatywa:
Szkoda, że Makefile nie mogą współdzielić definicji funkcji powłoki między wierszami.
źródło
Oto, czego używam w skryptach powłoki. Ukrywa komunikat o błędzie i kod błędu.
źródło
rm doesnotexist 2&> /dev/null
możesz dotknąć plików przed ich zapisaniem. które by je stworzyły, gdyby nie istniały :-)
źródło
napisz
rm -rf ppp>/dev/null 2>&1
nowszy komunikat o błędzie Wystąpił problem, jeśli błąd nie generuje STDERR 2, ale STDOUT 1 ... Dzieje się tak, gdy polecenie nie generuje błędu, ale ostrzeżenie. Musisz ustawić filtr i usunąć tę wiadomość. Ale ta sprawa jest zwyczajna.źródło
sprawdź, czy plik istnieje najpierw, a jeśli tak, to przekaż go do rm. Wtedy błędy z rm będą miały znaczenie. -f lub zignorowanie komunikatu o błędzie zazwyczaj obejmuje więcej niż to, czego chce osoba. -f może robić rzeczy, których nie chcesz robić.
dodaj więcej klauzul testowych, jeśli istnieje więcej plików, które chcesz mieć pewność.
źródło