Dzisiaj pisząc mój skrypt powłoki.
Nagle przychodzi mi do głowy pytanie.
Ponieważ cd /target_dir
i cd /target_dir/
oba działają.
Czy powinienem dodać ukośnik na końcu moich zmiennych ścieżki w skrypcie powłoki?
Takich jak LOG_PATH=/data/nginx/logs
kontra LOG_PATH=/data/nginx/logs/
.
Przeszukałem trochę wyszukiwarki w Google, ale nie znalazłem dyskusji na ten temat, może to zbyt proste?
Na razie naprawdę trudno mi zdecydować, który styl wybrać.
Ale bardziej wolałem LOG_PATH=/target_dir/
styl.
Ponieważ kiedy wykonuję autouzupełnianie za pomocą bash, wyskakuje mi wynik z ukośnikiem.
Jaka jest twoja opinia na ten temat, dlaczego?
shell
shell-script
Zen
źródło
źródło
Odpowiedzi:
Według POSIX:
źródło
//
a/
ich nazwa wyświetla się inaczej w wierszu polecenia bash, i używającpwd
otrzymam inną ścieżkę, ale ich zawartość jest identyczna! Dlaczego?bash
śledzi bieżący katalog w bardzo naiwny sposób, jako ciąg znaków. Po prostu heurystycznie dołącza i usuwa ze ścieżki, nie łączy się z rzeczywistym systemem plików. Jedną konsekwencją jest to, że możesz cd do dowiązania symbolicznego i wrócić w ten sam sposób (jeśli bash nie zdecydował, że to za dużo i ponownie zainicjował). Drugi jest tym, co opisujesz. Nie powinieneś polegać na śledzeniu bieżącego katalogu przez powłokę, jest to zawodne.Aby być bezpiecznym, dołącz ukośnik. Może to prowadzić do wielu ukośników podczas łączenia ścieżek, ale przynajmniej unikniesz problemów.
Kilka przykładów:
rsync
traktuje ścieżki inaczej, jeśli dołączony jest ukośnik końcowy (synchronizuje ten katalog zamiast tworzyć inny podkatalog). Dowiązania symboliczne do katalogów czasami zachowują się w nieoczekiwany sposób, gdy nie mają końcowego ukośnika - przynajmniej komplikacja powłoki jest myląca. Nigdy nie wiadomo, czy wywoływane polecenie / skrypt polega na sprawdzeniu ukośnika pod kątem jakiegoś specjalnego zachowania. Może nawet uratować cię przed nadpisaniem czegoś. Na przykład, jeśli masz plik o nazwiefoo
, ale błędnie uważasz, że jest to katalog i chcesz coś w nim przenieść, wówczasmv bar foo
nadpisze plik (utrata danych, potencjalna katastrofa), alemv bar foo/
po prostu narzeka i nic nie robi.Podsumowując, w większości przypadków nie ma to znaczenia, ale powinieneś użyć ukośnika, aby się chronić, a także, aby czytelnik zrozumiał, co zamierzasz zrobić w skrypcie. Przypadkowy obserwator natychmiast upewni się, że zmienna odnosi się do katalogu, jeśli kończy się ukośnikiem, i użyje go poprawnie, jeśli trzeba go zmodyfikować.
źródło
Nie, nie powinieneś. Dodaje dodatkowe niepotrzebne ukośnik (
/
).przykład
powiedz, że chcesz wyeksportować
bin
katalog java do swojejPATH
zmiennej,export PATH=$PATH:/opt/jre1.7.0_45/bin/
teraz sprawdź to,
zwróć uwagę na dodatkowy slash (
/
) przed java, ale na szczęście w takim przypadku po prostu działa.źródło