Mám obslužný program skládající se z několika adresářů s některými bash skripty a podpůrnými soubory, které budou rozmístěny na několika počítačích, možná v jiném adresáři na každém počítači. Skripty musí být schopny odkazovat cesty relativně k sobě, takže musím být schopen získat cestu k souboru, který je právě spuštěn.
Vím o dirname $0
idiom, který funguje perfektně, když je můj skript vyvolán přímo. Bohužel existuje přání, aby bylo možné vytvořit symlinks k těmto skriptům z úplně jiného adresáře a stále mít logiku relativní cesty.
Příklad celkové struktury driectory je následující:
/
|-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 mohu spolehlivě odkazovat na /usr/local/lib/foo/res/resource_file.txt
z script.sh
zda je vyvoláno /usr/local/lib/foo/bin/script.sh
nebo ~mike/bin/link_to_script
?
Zkuste to jako univerzální řešení:
DIR="$(cd "$(dirname "$0")" && pwd)"
V konkrétním případě následujících symbolických odkazů můžete toto provést také:
DIR="$(dirname "$(readlink -f "$0")")"
jeden řádek:
cd $(dirname $([ -L $0 ] && readlink -f $0 || echo $0))
readlink -f
nefunguje pro mě, mám tuto chybu:
readlink: illegal option -- f
usage: readlink [-n] [file ...]
Ale to funguje dobře:
DIR="$(dirname "$(readlink "$0")")"
echo $DIR
Jeden malý dodatek k výše uvedenému skriptu. Možnost -P pwd následuje symbolické odkazy
DIR="$(cd "$(dirname "$0")" && pwd -P)"