Mam narzędzie składające się z kilku katalogów z niektórymi skryptami bash i plikami pomocniczymi, które zostaną wdrożone na kilku komputerach, ewentualnie w innym katalogu na każdym komputerze. Skrypty muszą mieć możliwość odwoływania się do ścieżek względem siebie, więc muszę mieć możliwość uzyskania ścieżki do aktualnie wykonywanego pliku.
Zdaję sobie sprawę z dirname $0
idiomu, który działa idealnie, gdy mój skrypt jest wywoływany bezpośrednio. Niestety istnieje chęć stworzenia dowiązań symbolicznych do tych skryptów z zupełnie innego katalogu i nadal mieć względną logikę ścieżek.
Przykład ogólnej struktury suchej jest następujący:
/
|-usr/local/lib
| |-foo
| | |-bin
| | | |-script.sh
| | |-res
| | | |-resource_file.txt
|-home/mike/bin
| |-link_to_script (symlink to /usr/local/lib/foo/bin/script.sh)
Jak mogę w sposób wiarygodny odwoływać się /usr/local/lib/foo/res/resource_file.txt
do script.sh
tego, czy jest przywoływany przez /usr/local/lib/foo/bin/script.sh
czy ~mike/bin/link_to_script
?
źródło
source
d (np.$ source ./sript.sh
) Działa to w obu przypadkach:DIR="$(cd "$(dirname "$BASH_SOURCE")" && pwd)"
jedna linia:
źródło
readlink -f
nie działa dla mnie, mam ten błąd:Ale to działa dobrze:
źródło
Jeden mały dodatek do powyższego skryptu. Opcja -P do pwd podąża za dowiązaniami symbolicznymi
źródło