2011-09-09 26 views
7

tôi cần phải thực hiện một tập tin kịch bản hấp dẫn từ bash, và tôi cần những kịch bản để có một thư mục làm việc của thư mục đó tồn tại trongLàm cách nào để thực thi một tập lệnh tùy ý với thư mục hoạt động của thư mục trong đó?

Đó là, trong kịch bản bash của tôi, tôi đang làm điều này:.

/opt/script/myscript.groovy & 

Nhưng điều này dường như đặt thư mục hoạt động thành /etc/init.d, thư mục tôi đang gọi. Làm cách nào để thay đổi thư mục làm việc cho tập lệnh đó thành /opt/script?

+0

Câu trả lời là ở đây trong một số hình thức hoặc khác: http://stackoverflow.com/questions/59895/can-a-bash-script-tell-what-directory-its-stored-in – Chris

+0

@Chris: Ngoại trừ nó không phải. Kịch bản tùy ý ngụ ý * không bash *. Các câu trả lời cụ thể của Bash sẽ bị hủy bỏ. –

Trả lời

7

/etc/init.d

lẽ bạn đang runnig (bắt đầu) rằng kịch bản từ /etc/init.d?

Thêm cd /opt/script ở dòng đầu tiên của kịch bản

HOẶC

... để giữ cho nó năng động, thêm: cd "$(dirname "$0")"

+0

Đủ dễ dàng. CD'ing trước khi phần còn lại của kịch bản hoạt động tốt. –

1

Cái gì đó như có lẽ đây:

SCRIPT=/opt/script/myscript.groovy 
pushd `dirname $SCRIPT` 
./`basename $SCRIPT` 
popd 
+1

'popd' không cần thiết trong bất kỳ môi trường nào ngoại trừ một tệp DOS .BAT; những gì một quá trình để thay đổi thư mục không thể ảnh hưởng đến thư mục của chương trình chạy nó. –

2

Trong bash đặt điều đó trong tập lệnh hoạt động tốt nhất:

HERE=$(cd -- $(dirname ${BASH_SOURCE[0]}) > /dev/null && pwd) 
cd -- "$HERE" 

này sẽ thành công ngay cả với lời kêu cầu sau (của /path/to/script.sh):

PATH="/path/to:$PATH" bash script.sh 

nơi HERE=$(dirname $0) sẽ thất bại.

Tùy chọn bạn cũng có thể sử dụng pwd -P thay vì chỉ pwd, sau đó $HERE sẽ chứa đường dẫn (đường dẫn tuyệt đối được chuẩn hóa) là man 3 realpath.

15

Nếu bạn đang sử dụng start-stop-daemon bên trong kịch bản /etc/init.d, bạn có thể tận dụng lợi thế của tham số -d để đạt được điều này:

-d, --chdir path 
      Chdir to path before starting the process. This is done after the chroot if the -r|--chroot option is set. When not specified, start-stop-daemon will chdir to the root directory before starting the process. 
Các vấn đề liên quan