Làm cách nào để chạy tập lệnh từ đường dẫn khác và biết đường dẫn của tập lệnh?


8

Tôi cần chạy một tập lệnh truy cập một tập tin theo cùng một đường dẫn.

Ví dụ: Tôi có tập lệnh trong /home/me/folder/script.shvà tập lệnh này sẽ truy cập tệp /home/me/folder/myfile. Vì tập tin nằm trong cùng một đường dẫn của tập lệnh, tôi chỉ sử dụng tên myfilechứ không phải đường dẫn đầy đủ.

Nhưng nếu tôi chạy nó từ /tmp/, như:

/tmp$ /home/me/folder/script.sh

nó đưa cho tôi:

myfile: No such file or directory

Vì vậy, làm thế nào tôi có thể nói trong tập lệnh rằng tập tin nằm trong cùng một đường dẫn với chính tập lệnh?


Bạn có thể chỉ ra cách sử dụng myfile ở đây không?
Faheem Mitha

@Faheem Mitha: chỉ là một tập lệnh khác mà script.sh của tôi gọi.
Tom Brito

Một số lý do bạn không muốn sử dụng đường dẫn đầy đủ hoặc di chuyển cả hai đường dẫn này vào ĐƯỜNG của bạn?
Faheem Mitha

1
@Faheem Mitha: Tôi muốn có thể di chuyển thư mục này với các tập lệnh đến một nơi khác, thậm chí có thể là một máy tính khác mà không cần phải viết lại đường dẫn của myfile.
Tom Brito

Câu trả lời:



9

Bạn không thể biết trong mọi trường hợp, nhưng thường (không phải lúc nào) khi bạn chạy tập lệnh theo đường dẫn thay vì để tìm kiếm shell $PATH, đường dẫn đến tập lệnh sẽ nằm trong $0. Sau đó bạn có thể sử dụng dirname "$0"hoặc ${0%/*}để có được đường dẫn.


4

Tôi thường sẽ làm một cái gì đó như thế này ở phần đầu của kịch bản của mình:

SCRIPTDIR=$(dirname "$0")

Hoặc, để có được tên đường dẫn đầy đủ vào thư mục của tập lệnh (thay vì tên đường dẫn tương đối):

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

Sau đó chỉ cần tham khảo ${SCRIPTDIR}nơi cần thiết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.