2009-03-10 38 views
79

thể trùng lặp:
Can a Bash script tell what directory it's stored in?Xác định đường dẫn của kịch bản BASH thực hiện

Trong một kịch bản lệnh Windows, người ta có thể xác định thư mục đường dẫn của kịch bản hiện đang thực hiện sử dụng %~dp0 . Ví dụ:

@echo Running from %~dp0 

Điều gì sẽ tương đương với tập lệnh BASH?

+1

Nếu điều này trùng lặp, vui lòng liên kết với tài liệu gốc. – fpt

Trả lời

123

Đối với đường dẫn tương đối (tức là tương đương trực tiếp của Windows' %~dp0):

MY_PATH="`dirname \"$0\"`" 
echo "$MY_PATH" 

Đối với tuyệt đối, con đường bình thường:

MY_PATH="`dirname \"$0\"`"    # relative 
MY_PATH="`(cd \"$MY_PATH\" && pwd)`" # absolutized and normalized 
if [ -z "$MY_PATH" ] ; then 
    # error; for some reason, the path is not accessible 
    # to the script (e.g. permissions re-evaled after suid) 
    exit 1 # fail 
fi 
echo "$MY_PATH" 
+0

không hoạt động trên mac bash của tôi. –

+0

sự cố trên mac bash của bạn là gì? hoạt động tốt hơn ở đây trên Cygwin, Linux, Solaris, vv, và nó cũng phải làm việc trên mac – vladr

+0

nó chỉ cung cấp đường dẫn tương đối mặc dù –

16

Giả sử bạn gõ vào đường dẫn đầy đủ đến bash tập lệnh, sử dụng $0dirname, ví dụ:

#!/bin/bash 
echo "$0" 
dirname "$0" 

Ví dụ đầu ra phong phú:

$ /a/b/c/myScript.bash 
/a/b/c/myScript.bash 
/a/b/c 

Nếu cần, hãy nối kết quả của biến số $PWD vào đường dẫn tương đối.

CHỈNH SỬA: Thêm dấu ngoặc kép để xử lý ký tự khoảng trắng.

+0

@Rothko, giải pháp của bạn sẽ thất bại nếu $ 0 chứa khoảng trống. – vladr

+1

Trong thời gian bash bạn cũng có thể sử dụng '$ BASH_SOURCE'. Từ [bài đăng này] (http://stackoverflow.com/questions/59895/can-a-bash-script-tell-what-directory-its-stored-in). – JamesThomasMoon1979

7

Đóng góp bởi Stephane CHAZELAS trên c.u.s. Giả sử vỏ POSIX:

prg=$0 
if [ ! -e "$prg" ]; then 
    case $prg in 
    (*/*) exit 1;; 
    (*) prg=$(command -v -- "$prg") || exit;; 
    esac 
fi 
dir=$(
    cd -P -- "$(dirname -- "$prg")" && pwd -P 
) || exit 
prg=$dir/$(basename -- "$prg") || exit 

printf '%s\n' "$prg" 
+0

công trình tuyệt vời cho tôi trên Mac OSX các phương pháp tiếp cận khác trong câu hỏi này không. – ams

+0

+1 để xử lý lệnh gọi script thông qua tìm kiếm '$ PATH'; tuy nhiên, ở trên ** KHÔNG phải là POSIX **. Nó sẽ chỉ hoạt động với 'bash'. Sử dụng 'which' thay vì' command' và backticks thay vì '$ (...)' là điều này phải chạy dưới các shell cũ hơn. – vladr

+6

Xin chào @ vladr, mã trên là POSIX! Nếu tôi hiểu chính xác, ý của bạn là mã sẽ không chạy với shell Bourne cũ (/ bin/sh trên Solaris <11 chẳng hạn), nhưng điều đó không liên quan gì đến POSIX. –

1

Mã của Vlad bị kiểm soát quá mức. Phải là:

MY_PATH=`dirname "$0"` 
MY_PATH=`(cd "$MY_PATH" && pwd)` 
+0

Dòng thứ hai của bạn có thêm ký tự ngoặc kép. –

3
echo Running from `dirname $0` 
+2

'$ 0' phải được thoát (' dirname "$ 0" ') – fnkr

Các vấn đề liên quan