Podívejte se na realpath
který je dostupný na GNU/Linux, FreeBSD a NetBSD, ale ne OpenBSD 6.8. Používám něco jako:
CONTAININGDIR=$(realpath ${FILEPATH%/*})
dělat to, o čem to vypadá, že se snažíte.
Chcete-li získat úplnou cestu, použijte:
readlink -f relative/path/to/file
Chcete-li získat adresář souboru:
dirname relative/path/to/file
Můžete je také kombinovat:
dirname $(readlink -f relative/path/to/file)
Pokud readlink -f
není ve vašem systému k dispozici, můžete použít toto:
function myreadlink() {
(
cd "$(dirname $1)" # or cd "${1%/*}"
echo "$PWD/$(basename $1)" # or echo "$PWD/${1##*/}"
)
}
Všimněte si, že pokud se potřebujete přesunout pouze do adresáře souboru určeného jako relativní cesta, nemusíte znát absolutní cestu, relativní cesta je naprosto legální, takže stačí použít:
cd $(dirname relative/path/to/file)
pokud se chcete vrátit (za běhu skriptu) na původní cestu, použijte pushd
místo cd
a popd
až budete hotovi.
* Zatímco myreadlink
výše je v kontextu této otázky dost dobrý, má určitá omezení vzhledem k readlink
nástroj navržený výše. Například nenásleduje správně odkaz na soubor s jiným basename
.
Toto bude fungovat pro soubor i složku:
absPath(){
if [[ -d "$1" ]]; then
cd "$1"
echo "$(pwd -P)"
else
cd "$(dirname "$1")"
echo "$(pwd -P)/$(basename "$1")"
fi
}