it-swarm-eu.dev

Získat cestu k aktuálnímu skriptu, když je spuštěn pomocí symbolu

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?

59
Mike Deck

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")")"
83
Caleb

jeden řádek:

cd $(dirname $([ -L $0 ] && readlink -f $0 || echo $0))
8
diyism

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
4
Kevin Campion

Jeden malý dodatek k výše uvedenému skriptu. Možnost -P pwd následuje symbolické odkazy

DIR="$(cd "$(dirname "$0")" && pwd -P)"
0
user2108420