it-swarm-vi.com

Nhận đường dẫn của tập lệnh hiện tại khi được thực thi thông qua một liên kết tượng trưng

Tôi có một tiện ích bao gồm một vài thư mục với một số tập lệnh bash và các tệp hỗ trợ sẽ được triển khai cho một số máy có thể trong một thư mục khác nhau trên mỗi máy. Các tập lệnh cần có khả năng tham chiếu các đường dẫn liên quan đến chính chúng vì vậy tôi cần có thể có được đường dẫn đến tệp hiện đang được thực thi.

Tôi biết về dirname $0 thành ngữ hoạt động hoàn hảo khi tập lệnh của tôi được gọi trực tiếp. Thật không may, có một mong muốn có thể tạo ra các liên kết tượng trưng cho các tập lệnh này từ một thư mục hoàn toàn khác và vẫn có công việc logic đường dẫn tương đối.

Một ví dụ về cấu trúc khô tổng thể như sau:

/
 |-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)

Làm thế nào tôi có thể tham khảo đáng tin cậy /usr/local/lib/foo/res/resource_file.txt từ script.sh cho dù nó được gọi bởi /usr/local/lib/foo/bin/script.sh hoặc là ~mike/bin/link_to_script?

59
Mike Deck

Hãy thử điều này như một giải pháp cho mục đích chung:

DIR="$(cd "$(dirname "$0")" && pwd)"

Trong trường hợp cụ thể của các liên kết tượng trưng sau đây, bạn cũng có thể làm điều này:

DIR="$(dirname "$(readlink -f "$0")")"
83
Caleb

một đường thẳng:

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

readlink -f không hoạt động với tôi, tôi đã mắc lỗi này:

readlink: illegal option -- f
usage: readlink [-n] [file ...]

Nhưng điều này hoạt động tốt:

DIR="$(dirname "$(readlink "$0")")"
echo $DIR
4
Kevin Campion

Một bổ sung nhỏ cho kịch bản trên. Tùy chọn -P để pwd theo các liên kết tượng trưng

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