Załóżmy, że mam plik bash o nazwie myBash.bash
. Znajduje się w:
/myDirect/myFolder/myBash.bash
Teraz chcę użyć ciągu /myDirect/myFolder
(lokalizacji myBash.bash
) w skrypcie. Czy istnieje polecenie, którego mogę użyć, aby znaleźć tę lokalizację?
Edycja: Chodzi o to, że chcę skonfigurować folder zip z kodem, który można uruchomić za pomocą skryptu bash w tym pliku zip. Znam względne ścieżki pliku kodu w tym pliku zip, ale nie ścieżki absolutne i potrzebuję ich. Jednym ze sposobów byłoby na stałe zakodować ścieżkę lub wymagać podania ścieżki pliku jako zmiennej. Jednak łatwiej byłoby mi, gdyby plik bash mógł dowiedzieć się, gdzie jest on sam, a następnie utworzyć odpowiednie ścieżki do drugiego pliku na podstawie jego wiedzy o strukturze pliku zip.
command-line
bash
scripts
paths
dimpol
źródło
źródło
Odpowiedzi:
Możesz uzyskać pełną ścieżkę, taką jak:
I jak wskazał Serg , możesz użyć
dirname
do usunięcia nazwy pliku w ten sposóblub nawet lepiej, aby uniknąć niezręcznego cytowania i dzielenia słów przy trudnych nazwach plików:
O wiele lepszy niż mój wcześniejszy pomysł, który polegał na jego analizie (wiedziałem, że będzie lepszy sposób!)
Notatki
realpath
zwraca rzeczywistą ścieżkę do pliku$0
to ten plik (skrypt)s|old|new|
wymienićold
znew
\(.*\)/
zachowaj dowolne postacie wcześniej/
na później\1
zapisana częśćźródło
$0
ised
magię. Ale tased
magia jest naprawdę niepotrzebna, gdydirname
istnieją takie narzędziarealpath
:realpath "$( dirname $0 )"
osobiście skorzystałbym,readlink
ale to ja:readlink -e $(dirname $0)
dirname "$(realpath "$0")"
byłoby lepiej? Zwykle chce się znać katalog nadrzędny odnośnego pliku zamiast katalogu nadrzędnego dowiązania symbolicznego odnoszącego się do tego pliku."$(dirname "$(realpath "$0")")"
to najprostszy sposób. Cytaty w środku$()
działają normalnie.$()
bycie podpowłoką pozwoli mieć cytaty na zewnątrz. Nie powiedziałbym jednak, że jest to tak proste, chyba że się zorientuje, że$()
wszystkie sąjeśli skrypt znajduje się na twojej ścieżce, możesz użyć czegoś takiego
EDYCJA: po przeczytaniu komentarzy Serga może to być ogólne rozwiązanie, które działa niezależnie od tego, czy skrypt jest na twojej ścieżce, czy nie.
źródło
which
jest bardziej odpowiedni, gdy skrypt znajduje się w jednym z katalogów, które są częściąPATH
zmiennej. Używaj$0
z poziomu skryptu, tak jak pokazuje Zanna. Ale twoja odpowiedź jest właściwa, ponieważ używaszdirname
zamiastsed
Przyjęta odpowiedź wydaje się idealna. Oto inny sposób, aby to zrobić:
/bin/pwd
wypisuje prawdziwą ścieżkę do katalogu, w przeciwieństwie dopwd
wbudowanego polecenia.źródło
Jest pobierany jako odniesienie od kenorb i andro
Bez nazwy katalogu, readlink, realpath, BASH_SOURCE
Wszystkie są wbudowane
źródło