Wyobraź sobie, że mam ścieżkę, która nie istnieje:
$ ls /foo/bar/baz/hello/world
ls: cannot access /foo/bar/baz/hello/world: No such file or directory
Ale powiedzmy /foo/bar
nie istnieje. Czy mogę szybko ustalić, czy baz
jest to punkt krytyczny na ścieżce?
Używam Bash.
access(2)
nie jest zbyt szczegółowe, więc rozwiązanie zazwyczaj polega na napisaniu czegoś do iteracji i przetestowaniu kolejno każdego elementu ścieżki ...Odpowiedzi:
Biorąc pod uwagę kanoniczną nazwę ścieżki, taką jak Twoja, zadziała to:
Spowoduje to wydrukowanie ostatniego w pełni istniejącego / dostępnego komponentu
$pathname
i umieszczenie każdego z nich osobno w tablicy arg. Pierwszy nieistniejący składnik nie jest drukowany, ale jest zapisywany$p
.Możesz podejść do tego przeciwnie:
To albo wróci odpowiednio, albo w
$path
razie potrzeby zmniejszy koszty . Odmawia próby zmiany/
, ale jeśli się powiedzie, wydrukuje zarówno bieżący katalog roboczy, jak i katalog, w którym zmienia się na standardowe wyjście. Twój prąd również$PWD
zostanie włączony$OLDPWD
.źródło
for p in $pathname
będą podlegały „dzieleniu słów” i „rozwijaniu nazw ścieżek”.$IFS
. dokładnie tak to działa. nie podlega rozszerzaniu nazw ścieżek, z tym wyjątkiem, że zmienna tutaj nazywana$pathname
jest rozwijana do tablicy składników ścieżek w podziale$IFS
.$pathname
set -f
ns
, co, jeśli zostanie użyte tutaj, sprawi, że dyskusja stanie się dyskusyjna.Jednym z moich ulubionych programów jest
namei
częśćutil-linux
i stąd ogólnie obecna tylko w Linuksie:Ale jego wyniki nie są bardzo analizowalne. Więc jeśli chcesz tylko wskazać, że czegoś brakuje,
namei
może być przydatne.Przydaje się to do rozwiązywania ogólnych problemów z dostępem do ścieżki, ponieważ można ustawić, czy komponent jest linkiem czy punktem podłączenia, a także uprawnienia:
Stolica
D
wskazuje punkt montowania.źródło
namei
działa dla mnie tak długo, jak jest to kanał, który istnieje, ale gdy dam mu taki, którego nie dostanęnamei: failed to stat: /usr/share/foo/bar: No such file or directory
.Coś w tym stylu (uwzględnianie ścieżek z osadzonymi odstępami):
źródło
cd not_a_directory
twoja powłoka napisze do stderr coś w rodzajucd:cd:6: no such file or directory: not_a_directory
. W rzeczywistości powłoka użytkownika zrobi to w formacie, z którym użytkownik prawdopodobnie już jest bardzo dobrze zaznajomiony. W końcu prawie zawsze jest to łatwiejsze i lepsze, aby po prostu robić różne rzeczy i pozwolić powłoce obsługiwać raportowanie w razie potrzeby. Tego rodzaju filozofia wymaga jednak bardzo ścisłej uwagi na temat zwracanych wartości oraz ich promowania / zachowania.Tylko alternatywne rozwiązanie dla bash, zakładając, że ścieżka jest ścieżką absolutną (zaczyna się od /):
źródło
pa
jakopa_prev
pierwszą linię pętli while (zanim zostanie zwiększona). Gdy test „pa” nie powiedzie się,pa_prev
ma ostatni istniejący katalog w podanej ścieżce.nie jest to proste, ale możesz umieścić go w skrypcie, sprawić, by był wykonywalny i umieścić go gdzieś na swojej ścieżce, jeśli będziesz go często używać.
Zastrzeżenie emptor: Jeśli nazwa katalogu na dowolnym poziomie zawiera
space
znak, to NIE zadziała.źródło