Chcę poprosić użytkownika mojego skryptu bash o podanie ścieżki katalogu jako argumentu. Które z poniższych jest dobrą praktyką programowania?
- Wymagaj, aby użytkownik wprowadził końcowe / (ukośnik)
- Wymagaj, aby użytkownik nie wprowadzał końcowego / (ukośnika)
programming-practices
user-interface
bash
Rohit Agarwal
źródło
źródło
rsync
zachowuje się inaczej w bardzo ważny sposób w zależności od obecności końca/
, więc w niektórych przypadkach chciałbyś znormalizować dla spójności, a w innych chciałbyś przejść czysto, aby wdrożyć to, co powiedział użytkownik (jeśli wiedziałem, że rozmawiająrsync
).ls -l dir
zachowuje się inaczej niżls -l dir/
jeślidir
jest dowiązaniem symbolicznym do katalogu.Odpowiedzi:
Najlepszą praktyką jest nie zakładanie żadnego z nich.
Jeśli masz dostęp do narzędzi / klas narzędzia do budowania ścieżek, skorzystaj z nich, jeśli nie, napisz kod, aby zaakceptować dowolny format i odpowiednio postępować.
Nic nie jest bardziej denerwujące dla użytkownika niż konieczność pamiętania, czy dodać ukośnik końcowy, czy nie.
źródło
dirname
,basename
ireadlink
. Bardzo częstym problemem jest${path##*/}
zastępowaniebasename
, ale jeśli ścieżka kończy się ukośnikiem, który zwraca pusty ciąg zamiast ostatniego elementu ścieżki.rsync
patrzę na ciebie)${STR}$(printf \\$(printf '%03o' $(($(printf '%d' "'${STR:(-1)}")==47?0:47))))
udokumentowałem to również dla jasności: dodaj lub usuń końcowy ukośnik w bashPonieważ bash ignoruje wiele ukośników, możesz bezpiecznie założyć, że użytkownik nie wprowadził ukośnika na ścieżce i sam go dodać.
jest taki sam jak
Twój skrypt może wyglądać następująco:
i nie musisz się martwić, czy użytkownik wejdzie na trailing / na ścieżkę.
źródło
bash
zachowanie, jądro to robi.Zmarły Jon Postel miał kilka świetnych rad w sekcji 3.2 RFC 760, które mają tutaj zastosowanie:
źródło
Pod względem koncepcyjnym ukośnik nie jest częścią nazwy. Ukośnik jest tylko separatorem między nazwami. Mój katalog domowy to / home / stefan, a nie / home / stefan /.
Jeśli nie spodziewasz się końcowego ukośnika, nie zawiedziesz, jeśli taki istnieje, jak już wspomniano amunicji. Ale możesz łatwo skleić nazwy i zmienne, ponieważ nie musisz cytować ukośnika:
źródło
Wymaganie, aby katalog nie zawierał ukośnika końcowego, byłoby bardzo denerwujące dla interaktywnego użycia na konsoli: automatyczne uzupełnianie za pomocą TAB automatycznie dodaje ukośnik końcowy dla katalogów.
Więc na pewno musisz zezwolić, aby katalogi były oznaczone końcowym ukośnikiem.
źródło