Câu hỏi cũ, nhưng có cách đơn giản hơn nhiều nếu bạn đang xử lý tên đường dẫn đầy đủ ở cấp độ vỏ:
abspath = "$ (cd" $ đường dẫn "&& pwd)"
Vì cd xảy ra trong một subshell, nó không ảnh hưởng đến tập lệnh chính.
Hai biến thể, giả sử các lệnh tích hợp trong shell của bạn chấp nhận -L và -P, là:
abspath = "$ (cd -P" $ path "&& pwd -P)" #physical path với các liên kết được giải quyết
abspath = "$ (cd -L" $ path "&& pwd -L)" #logical path bảo tồn các liên kết tượng trưng
Cá nhân, tôi hiếm khi cần cách tiếp cận sau này trừ khi tôi say mê với các liên kết tượng trưng vì một số lý do.
FYI: biến thể trong việc lấy thư mục bắt đầu của tập lệnh hoạt động ngay cả khi tập lệnh thay đổi thư mục hiện tại sau này.
name0 = "$ (tên cơ sở" $ 0 ")"; #base tên của tập lệnh
dir0 = "$ (cd" $ (tên hiệu "$ 0") "&& pwd)"; #absolute bắt đầu dir
Việc sử dụng CD đảm bảo bạn luôn có thư mục tuyệt đối, ngay cả khi tập lệnh được chạy bởi các lệnh như ./script.sh, mà không có cd / pwd, thường chỉ cung cấp .. Vô dụng nếu tập lệnh thực hiện cd sau này.
/foo/bar
hoặc thậm chí/foo
thực sự tồn tại, hoặc bạn chỉ quan tâm đến khía cạnh thao tác chuỗi theo quy tắc tên đường dẫn?