W skrypcie dostaję $0
możliwą względną ścieżkę do niego. Aby przekonwertować go na wartość absolutną, znalazłem rozwiązanie, którego nie rozumiem:
abspath=$(cd ${0%/*} && echo $PWD/${0##*/})
Moim problemem jest magia wewnątrz ${0%/*}
i ${0##*/}
. Wygląda na to, że pierwszy wyodrębnia nazwę katalogu, a drugi wyodrębnia nazwę pliku, po prostu nie rozumiem, jak to zrobić.
readlink -f $0
aby uzyskać ścieżkę kanoniczną.dirname
Util jest tu przydatna.BASH_SOURCE
jest lepsza niż$0
, ponieważ$0
daje użytkownikowi wpisane polecenie, które może nie być aktualnie wykonywanym skryptem.Odpowiedzi:
Definicje:
${string%substring}
usuwa najkrótsze dopasowanie$substring
z końca$string
.${string##substring}
usuwa najdłuższe dopasowanie$substring
od początku$string
.Twój przykład:
${0%/*}
usuwa wszystko po ostatnim ukośniku, podając nazwę katalogu skryptu (która może być ścieżką względną).${0##*/}
usuwa wszystko do ostatniego ukośnika, podając tylko nazwę skryptu.To polecenie zmienia katalog na skrypt i łączy bieżący katalog roboczy (podany przez
$PWD
) oraz nazwę skryptu, podając bezwzględną ścieżkę.Aby zobaczyć, co się dzieje, spróbuj:
źródło
Shawn miał najprostsze rozwiązanie:
readlink -f $0
. Jeśli chcesz mieć absolutną pewność obsługi dziwnych nazw plików, możesz użyć tego:Dokumentacja
źródło
readlink -fn
jest specyficzny dla Linuksa, NetBSD i OpenBSD.Oto bezpieczniejszy i bardziej czytelny sposób wykonania tej pracy:
Uwagi:
$0
jest to pusta nazwa pliku bez poprzedzającej ścieżki, oryginalny skrypt nie powiedzie się, ale podany tutaj będzie działał. (Nie stanowi to problemu,$0
ale może występować w innych aplikacjach).$0
, ale może występować w innych aplikacjach).unset
to niezbędne, jeśli użytkownik mógł to zrobićCDPATH
.readlink -f
lubrealpath
, będzie to działać na wersjach Unixa innych niż Linux (np. Mac OS X).źródło
Jeśli chcesz nauczyć się rozszerzenia parametrów powłoki, możesz przeczytać go tutaj , ale rozszerzenie nie zawsze jest dobrym wyborem. W tym przypadku prawie każdy system uniksowy ma 2 dobre narzędzia:
Pierwszy wyodrębni nazwę pliku, a drugi wyodrębni ścieżkę, więc jeśli masz 0 USD, powiedz:
I dostaniesz ścieżkę.
Twoje zdrowie
źródło
Przedstawiamy pwd, wbudowane bash. Znalezione również w pakiecie GNU coreutils.
źródło