Czy powinienem używać ukośnika na końcu zmiennych ścieżki w skrypcie powłoki, czy nie? [Zamknięte]

11

Dzisiaj pisząc mój skrypt powłoki.

Nagle przychodzi mi do głowy pytanie.

Ponieważ cd /target_diri 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/logskontra 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?

Zen
źródło
Nie ma reguły. Oba style kodowania mają pewne zalety i wady.
andcoz

Odpowiedzi:

9

Według POSIX:

Definicja nazwy ścieżki:

Ciąg używany do identyfikacji pliku. Ma opcjonalne początkowe znaki <ukośnik> , po których następuje zero lub więcej nazw plików oddzielonych znakami <ukośnik> . Nazwa ścieżki może opcjonalnie zawierać jeden lub więcej końcowych znaków <ukośnik> . Wiele kolejnych znaków <ukośnik> uważa się za takie same jak jeden <ukośnik> , z wyjątkiem przypadku dokładnie dwóch wiodących znaków <ukośnik> .

MichalH
źródło
@ Interesujące jest to, że mogę cd do, //a /ich nazwa wyświetla się inaczej w wierszu polecenia bash, i używając pwdotrzymam inną ścieżkę, ale ich zawartość jest identyczna! Dlaczego?
Zen
1
Ponieważ 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.
Orion
Powiązane: Dziwna różnica między pwd i / bin / pwd .
G-Man mówi „Reinstate Monica”
6

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: rsynctraktuje ś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 nazwie foo, ale błędnie uważasz, że jest to katalog i chcesz coś w nim przenieść, wówczas mv bar foonadpisze plik (utrata danych, potencjalna katastrofa), ale mv 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ć.

orion
źródło
2

Nie, nie powinieneś. Dodaje dodatkowe niepotrzebne ukośnik ( /).

przykład

powiedz, że chcesz wyeksportować binkatalog java do swojej PATHzmiennej,

export PATH=$PATH:/opt/jre1.7.0_45/bin/

teraz sprawdź to,

user@host:~$ which java
/opt/jre1.7.0_45/bin//java

zwróć uwagę na dodatkowy slash ( /) przed java, ale na szczęście w takim przypadku po prostu działa.

Arnab
źródło
Widziałem w tym linku odpowiedź 31 głosów, w której autor uważa, że ​​powinniśmy dodać ukośnik. Jestem zmieszany. stackoverflow.com/questions/980255/…
Zen.
@Zen, tak, sprawdziłem to, to był pierwszy komentarz do twojego pytania. Dzięki.
Arnab
6
Lepsze dwa ukośniki niż żaden. Ten jest brzydki, ale bezpieczny ... druga opcja jest znacznie gorsza i może być niebezpieczna.
Orion