Hãy thử các lớp lót đơn giản sau:
Đối với tất cả UNIX / OSX / Linux
dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
Bash
dir=$(cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)
Lưu ý: Dấu gạch ngang kép (-) được sử dụng trong các lệnh để biểu thị sự kết thúc của các tùy chọn lệnh, vì vậy các tệp có dấu gạch ngang hoặc các ký tự đặc biệt khác sẽ không phá vỡ lệnh.
Lưu ý: Trong Bash, sử dụng có ${BASH_SOURCE[0]}
lợi cho $0
, nếu không đường dẫn có thể bị phá vỡ khi tìm nguồn cung ứng ( source
/ .
).
Đối với Linux, Mac và * BSD khác:
cd "$(dirname "$(realpath "$0")")";
Lưu ý: realpath
nên được cài đặt trong bản phân phối Linux phổ biến nhất theo mặc định (như Ubuntu), nhưng trong một số phần có thể bị thiếu, vì vậy bạn phải cài đặt nó.
Lưu ý: Nếu bạn đang sử dụng Bash, hãy sử dụng ${BASH_SOURCE[0]}
để ủng hộ $0
, nếu không, đường dẫn có thể bị phá vỡ khi tìm nguồn cung ứng ( source
/ .
).
Nếu không, bạn có thể thử một cái gì đó như thế (nó sẽ sử dụng công cụ hiện có đầu tiên):
cd "$(dirname "$(readlink -f "$0" || realpath "$0")")"
Đối với Linux cụ thể:
cd "$(dirname "$(readlink -f "$0")")"
Sử dụng liên kết đọc GNU trên * BSD / Mac:
cd "$(dirname "$(greadlink -f "$0")")"
Lưu ý: Bạn cần phải coreutils
cài đặt (ví dụ: 1. Cài đặt Homebrew , 2. brew install coreutils
).
Trong bash
Trong bash, bạn có thể sử dụng Mở rộng tham số để đạt được điều đó, như:
cd "${0%/*}"
nhưng nó không hoạt động nếu tập lệnh được chạy từ cùng một thư mục.
Ngoài ra, bạn có thể xác định chức năng sau trong bash:
realpath () {
[[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"
}
Hàm này có 1 đối số. Nếu đối số đã có đường dẫn tuyệt đối, hãy in nó như hiện tại, nếu không thì in $PWD
biến + đối số tên tệp (không có ./
tiền tố).
hoặc đây là phiên bản lấy từ .bashrc
tệp Debian :
function realpath()
{
f=$@
if [ -d "$f" ]; then
base=""
dir="$f"
else
base="/$(basename "$f")"
dir=$(dirname "$f")
fi
dir=$(cd "$dir" && /bin/pwd)
echo "$dir$base"
}
Liên quan:
Xem thêm:
Làm cách nào tôi có thể có được hành vi của readlink -f của GNU trên máy Mac?