Các dirname
lệnh cơ bản, chỉ cần phân tích các con đường lên đến tên tập tin giảm giá của hầu hết $0
(tên script) biến:
dirname "$0"
Nhưng, như matt b đã chỉ ra, đường dẫn được trả về là khác nhau tùy thuộc vào cách gọi tập lệnh. pwd
không thực hiện công việc vì nó chỉ cho bạn biết thư mục hiện tại là gì chứ không phải thư mục nằm trong thư mục nào. Ngoài ra, nếu một liên kết tượng trưng đến tập lệnh được thực thi, bạn sẽ có đường dẫn (có thể là tương đối) đến nơi liên kết cư trú, không phải là kịch bản thực tế.
Một số người khác đã đề cập đến readlink
lệnh, nhưng đơn giản nhất, bạn có thể sử dụng:
dirname "$(readlink -f "$0")"
readlink
sẽ giải quyết đường dẫn tập lệnh đến một đường dẫn tuyệt đối từ thư mục gốc của hệ thống tập tin. Vì vậy, bất kỳ đường dẫn nào chứa các dấu chấm đơn hoặc kép, dấu ngã và / hoặc liên kết tượng trưng sẽ được giải quyết thành một đường dẫn đầy đủ.
Đây là một kịch bản thể hiện từng điều này , whatdir.sh
:
#!/bin/bash
echo "pwd: `pwd`"
echo "\$0: $0"
echo "basename: `basename $0`"
echo "dirname: `dirname $0`"
echo "dirname/readlink: $(dirname $(readlink -f $0))"
Chạy tập lệnh này trong thư mục nhà của tôi, sử dụng đường dẫn tương đối:
>>>$ ./whatdir.sh
pwd: /Users/phatblat
$0: ./whatdir.sh
basename: whatdir.sh
dirname: .
dirname/readlink: /Users/phatblat
Một lần nữa, nhưng sử dụng đường dẫn đầy đủ đến tập lệnh:
>>>$ /Users/phatblat/whatdir.sh
pwd: /Users/phatblat
$0: /Users/phatblat/whatdir.sh
basename: whatdir.sh
dirname: /Users/phatblat
dirname/readlink: /Users/phatblat
Bây giờ thay đổi thư mục:
>>>$ cd /tmp
>>>$ ~/whatdir.sh
pwd: /tmp
$0: /Users/phatblat/whatdir.sh
basename: whatdir.sh
dirname: /Users/phatblat
dirname/readlink: /Users/phatblat
Và cuối cùng sử dụng một liên kết tượng trưng để thực thi tập lệnh:
>>>$ ln -s ~/whatdir.sh whatdirlink.sh
>>>$ ./whatdirlink.sh
pwd: /tmp
$0: ./whatdirlink.sh
basename: whatdirlink.sh
dirname: .
dirname/readlink: /Users/phatblat
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd && echo x)"
- và loại bỏ nó mà không cần thay thế lệnh -DIR="${DIR%x}"
.