dirname to mała komenda z pakietu GNU coreutils, która ze ścieżki wycina ostatni człon (nazwę pliku albo katalogu) i zwraca to, co zostało — czyli katalog nadrzędny. Dajesz jej /etc/nginx/nginx.conf, dostajesz /etc/nginx. Jest czysto tekstowa: nie sprawdza, czy plik istnieje, tylko mechanicznie tnie napis po znakach /. Dlatego idealnie nadaje się do skryptów, gdzie musisz dobrać się do folderu, w którym leży dany plik.
Składnia i najważniejsze opcje
Podstawowa forma: dirname [OPCJE] ŚCIEŻKA...
-z,--zero— kończy każdą linię wyjścia znakiem NUL zamiast nową linią. Przydatne, gdy wynik podajesz doxargs -0i obawiasz się spacji w nazwach.--help— wyświetla krótką pomoc i kończy działanie.--version— pokazuje wersję coreutils.
To w zasadzie cały arsenał — dirname nie ma dziesiątek flag, bo robi jedną rzecz. Za to przyjmuje wiele argumentów naraz: dirname a/b c/d zwróci dwie linie, a i c.
Przykłady użycia
dirname /var/www/learningzone.pl/index.php— zwróci/var/www/learningzone.pl, czyli katalog z plikiem.cd "$(dirname "$0")"— klasyk na początku skryptu: przeskakuje do katalogu, w którym leży sam skrypt, niezależnie skąd go uruchomiono.dirname /etc/nginx/— uwaga, końcowy ukośnik jest obcinany, więc dostaniesz/etc, a nie/etc/nginx.dirname plik.txt— gdy w ścieżce nie ma żadnego/, zwraca.(bieżący katalog).dirname log/a.txt log/b.txt— przetworzy obie ścieżki, drukująclogw dwóch liniach.
Częste błędy i pułapki
Najczęstsza wpadka to brak cudzysłowów. Jeśli ścieżka zawiera spację, jak dirname /home/jan/moje pliki/raport.txt, powłoka potraktuje to jako dwa osobne argumenty i wynik cię zaskoczy. Zawsze pisz dirname "$zmienna".
Druga pułapka: dirname nie waliduje istnienia ścieżki — chętnie zwróci katalog dla pliku, którego nie ma. To narzędzie do parsowania tekstu, nie do sprawdzania systemu plików.
Pamiętaj też, że to komenda zewnętrzna, a nie składnia powłoki. W bashu szybsze bywa rozwinięcie ${ZMIENNA%/*}, które robi podobną rzecz bez odpalania procesu. Drobna różnica między systemami: na minimalnych obrazach (np. starsze BusyBox) dirname może nie znać opcji -z — to rozszerzenie GNU.
Powiązane komendy: basename (robi odwrotność — zwraca samą nazwę pliku), realpath i readlink -f (rozwijają ścieżkę do pełnej, kanonicznej postaci), oraz pwd.