Chciałbym napisać skrypt powłoki, który sprawdza, czy określony plik archived_sensor_data.json
istnieje, a jeśli tak, usuwa go. Po http://www.cyberciti.biz/tips/find-out-if-file-exists-with-conditional-expressions.html wypróbowałem następujące rozwiązania:
[-e archived_sensor_data.json] && rm archived_sensor_data.json
Jednak powoduje to błąd
[-e: command not found
kiedy próbuję uruchomić wynikowy test_controller
skrypt za pomocą ./test_controller
polecenia. Co jest nie tak z kodem?
Odpowiedzi:
Brakuje wymaganej przestrzeni między nawiasem a
-e
:źródło
[ -e archived_sensor_data.json ] && rm archived_sensor_data.json
. Wydaje się, że skrypt teraz działa.if [ -e "$1" ]
(argument wejściowy nazwy pliku).Oto alternatywna metoda wykorzystująca
ls
:Jeśli chcesz ukryć dane wyjściowe,
ls
aby zobaczyć tylko tak lub nie, przekierujstdout
istderr
do/dev/null
:źródło
ls
się powiedzie, to jest taki plik, w przeciwnym razie nie ma”. Jeśli sięls
nie powiedzie, nie oznacza to, że brakuje tego pliku. To może być inny błąd. Na przykład utwórz plik w katalogu należącym do roota i spróbuj zrobić tols
jako zwykły użytkownik. To się nie powiedziePermission denied
, co nie jest równoważne, że plik nie istnieje.Tłem dla mojej rekomendacji rozwiązania jest historia znajomego, który w drugim tygodniu swojej pierwszej pracy wyczyścił pół serwera kompilacji. Więc podstawowym zadaniem jest dowiedzieć się, czy plik istnieje, a jeśli tak, usuńmy go. Ale na tej rzece jest kilka zdradliwych bystrzy:
Wszystko jest plikiem.
Skrypty mają prawdziwą moc tylko wtedy, gdy rozwiązują ogólne zadania
Mówiąc ogólnie, używamy zmiennych
Często używamy -f force w skryptach, aby uniknąć ręcznej interwencji
A także miłość -r rekurencyjna, aby mieć pewność, że tworzymy, kopiujemy i niszczymy w odpowiednim czasie.
Rozważ następujący scenariusz:
Mamy plik, który chcemy usunąć: filesexists.json
Ta nazwa pliku jest przechowywana w zmiennej
Mamy również zmienną ścieżki, aby uczynić rzeczy naprawdę elastycznymi
Zobaczmy więc, czy
-e
robi to, co powinien. Czy pliki istnieją?To robi. Magia.
Jednak co by się stało, gdyby zmienna pliku została przypadkowo oceniona jako nuffin '
Co? Ma powrócić z błędem ... I to jest początek historii, jak cały ten folder został przypadkowo usunięty
Alternatywą może być przetestowanie pod kątem tego, co rozumiemy jako „plik”
Więc plik istnieje ...
Więc to nie jest plik i być może nie chcemy usuwać całego katalogu
man test
ma do powiedzenia:źródło
Wewnętrznie polecenie rm i tak musi sprawdzać istnienie pliku,
więc po co dodawać kolejny test? Po prostu wystaw
i po tym odejdzie, czy tam był, czy nie.
Użyj rm -f, jeśli nie chcesz żadnych wiadomości o nieistniejących plikach.
Jeśli musisz wykonać jakąś akcję, jeśli plik NIE istnieje, musisz to sprawdzić samodzielnie. Na podstawie Twojego przykładowego kodu nie ma to miejsca w tym przypadku.
źródło
Jeśli używasz NFS, „test” jest lepszym rozwiązaniem, ponieważ możesz dodać do niego limit czasu na wypadek, gdyby twój NFS nie działał:
Konstrukcja "[-e moj_plik]" zawiesza się do czasu, gdy NFS znów będzie działał:
źródło
test
i[
są synonimami. Możesz również użyćtimeout
with[
, atest
także zawiesza się, jeśli NFS się zawiesza.