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?



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> .


@ 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


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ć.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.