Lihatlah realpath
yang tersedia di GNU/Linux, FreeBSD dan NetBSD, tetapi bukan OpenBSD 6.8. Saya menggunakan sesuatu seperti:
CONTAININGDIR=$(realpath ${FILEPATH%/*})
untuk melakukan apa yang sepertinya Anda coba lakukan.
Untuk mendapatkan jalur lengkap gunakan:
readlink -f relative/path/to/file
Untuk mendapatkan direktori file:
dirname relative/path/to/file
Anda juga dapat menggabungkan keduanya:
dirname $(readlink -f relative/path/to/file)
Jika readlink -f
tidak tersedia di sistem Anda, Anda dapat menggunakan ini:
function myreadlink() {
(
cd "$(dirname $1)" # or cd "${1%/*}"
echo "$PWD/$(basename $1)" # or echo "$PWD/${1##*/}"
)
}
Perhatikan bahwa jika Anda hanya perlu pindah ke direktori file yang ditentukan sebagai jalur relatif, Anda tidak perlu mengetahui jalur absolut, jalur relatif legal, jadi gunakan saja:
cd $(dirname relative/path/to/file)
jika Anda ingin kembali (saat skrip berjalan) ke jalur asli, gunakan pushd
bukannya cd
, dan popd
setelah selesai.
* Sedangkan myreadlink
di atas cukup baik dalam konteks pertanyaan ini, ia memiliki beberapa batasan relatif terhadap readlink
alat yang disarankan di atas. Misalnya tidak mengikuti tautan ke file dengan basename
yang berbeda dengan benar .
Ini akan berfungsi untuk file dan folder:
absPath(){
if [[ -d "$1" ]]; then
cd "$1"
echo "$(pwd -P)"
else
cd "$(dirname "$1")"
echo "$(pwd -P)/$(basename "$1")"
fi
}