2009-11-02 22 views
19

Tôi đã cố tạo một init script bằng start-stop-daemon. Tôi bị mắc kẹt trên các đối số cho daemon. Tôi muốn giữ chúng trong một biến ở phía trên của kịch bản nhưng tôi không thể nhận được các trích dẫn để lọc xuống một cách chính xác.start-stop-daemon trích dẫn các đối số đã giải thích sai

Tôi sẽ sử dụng ls ở đây để chúng tôi không phải xem các tệp nhị phân và đối số mà hầu hết mọi người đều không biết hoặc quan tâm.

Kết quả cuối cùng tôi tìm cho start-stop ... chạy ls -la "/ thư mục với không gian /"

DAEMON=/usr/bin/ls 
DAEMON_OPTS='-la "/folder with space/"' 

start-stop-daemon --start --make-pidfile --pidfile $PID --exec $DAEMON -- $DAEMON_OPTS 

đúp thoát các tùy chọn và cố gắng vô số biến thể của ngôn đừng giúp ... Sau đó, họ kết thúc ở daemon họ luôn luôn rối tung lên. Đính kèm $ DAEMON_OPTS trong dấu ngoặc kép thay đổi mọi thứ ... sau đó chúng được xem là một từ trích dẫn ... không bao giờ đúng số mặc dù :)

Khi đọc dòng lệnh (bắt đầu dừng ...) in chính xác công cụ phù hợp để sàng lọc. Nhưng daemon (thực tế, không phải ls) phàn nàn về số lượng các đối số sai.

Làm cách nào để chỉ định một biến để các dấu ngoặc kép bên trong biến được đưa cùng với daemon chính xác?

+0

Để làm rõ. Tôi đã thử rất nhiều biến thể báo giá thông thường. đơn bên trong dấu ngoặc kép, "-la '/ thư mục ... đôi bên trong dấu nháy đơn,' -la"/thư mục ... dấu ngoặc kép thoát, "-la \"/thư mục ... \ "" chỉ sử dụng dấu gạch chéo ngược cho mỗi không gian thay thế, thư mục \ với ... Tôi mơ hồ tưởng tượng vấn đề là bằng cách nào đó với start-stop-daemon và giải thích ... nhưng điều đó không có ý nghĩa gì nhiều kể từ khi thay thế biến trên dòng lệnh mang lại kết quả hoạt động. –

Trả lời

7

tôi nghĩ rằng tôi muốn gửi những trích dẫn chính thức được sử dụng trong init script làm việc của tôi:

COMMAND="/path/to/script -opt param param2 param3" 
DAEMON_OPTS=" 0.0.0.0:$PORT -dest $OUTPUT_DIRECTORY -command" 

start-stop-daemon --start --background --make-pidfile --pidfile $PID --exec $DAEMON -- $DAEMON_OPTS "\"$COMMAND\"" 

Rõ ràng một ví dụ không đầy đủ và không có chức năng nhưng tôi hy vọng bạn sẽ có được các ý chính của nó. Các trích dẫn kép với cặp bên trong thoát ra là những gì đã làm các trick.

+0

Điều này có thể hoạt động, nhưng nó đòi hỏi bạn phải sửa đổi init script, đó là một mất mát lớn. Tôi muốn để có thể thiết lập các biến trong/etc/default/bất cứ điều gì và sau đó không phải duy trì chúng trong một init script khi bạn nâng cấp một gói. – deltaray

+0

Tôi nghĩ bạn nên luôn bao gồm các ví dụ hoàn chỉnh thay vì một nửa ví dụ. –

13

Hãy thử

DAEMON_OPTS="-la '/folder with space/'" 
start-stop-daemon --start ... -- $DAEMON_OPTS 

gì xảy ra là có dấu ngoặc kép bên ngoài của DAEMON_OPTS đang tước nhưng bên trong (dấu nháy đơn) vẫn còn. Vì vậy, dòng tiếp theo sẽ đọc:

start-stop-daemon --start ... -- -la '/folder with space/' 

đó là những gì bạn muốn.

Cũng có thể đạt được hiệu ứng tương tự với thoát nhưng bạn cần rất nhiều thoát cho điều này: Đầu tiên, để bảo vệ dấu ngoặc kép trong quá trình gán, sau đó khi dòng bắt đầu được phân tích cú pháp và biến được mở rộng và thậm chí có thể một lần nhiều hơn hoặc ít hơn. :) bash -x là bạn của bạn cho những thứ như thế.

[EDIT] Mã ở trên không hoạt động với vỏ Bourne và Korn trên bất kỳ thứ gì ngoài Linux. Trên Linux, với ksh hoặc bash, vỏ sẽ thêm dấu ngoặc kép bổ sung mà lộn xộn lên toàn bộ điều:

FOLDER="/folder with space/" 
DAEMON_OPTS="-la $FOLDER" 
start-stop-daemon --start ... -- $DAEMON_OPTS 

Nếu bạn chạy nó với -x, bạn sẽ thấy:

FOLDER='/folder with space/' 
DAEMON_OPTS='-la ~/folder with space/' 
ls -la '~/folder' with space/ 

Vì vậy, chỉ có từ đầu tiên được bảo vệ (có lẽ vì nó chứa một ký tự đặc biệt). Nếu tôi thêm dấu nháy đơn xung quanh $FOLDER, tôi nhận được:

FOLDER='/folder with space/' 
DAEMON_OPTS='-la '\''~/folder with space/'\''' 
ls -la ''\''~/folder' with 'space/'\''' 

Well done. Cách giải quyết: Tách các tùy chọn vào hai biến: Một với các tùy chọn và khác với đường dẫn:

start-stop-daemon --start ... -- $DAEMON_OPTS "$DAEMON_PATH" 

[EDIT2] này hoạt động, quá:

FOLDER="$HOME/folder with space/" 
opt[0]=-la 
opt[1]=$FOLDER 
ls "${opt[@]}" 

ví dụ: ghép các từ thành một mảng.

+0

Có lẽ tôi đang làm điều gì đó sai, nhưng giải pháp này không hoạt động khi tôi thử nó? –

+0

Yep, không hoạt động với bash:/Tôi đã sử dụng thành công này để chuyển đối số cho các bảng con bằng cách sử dụng vòng lặp trên các đối số và sử dụng 'args =" $ args '$ opt' "' và sau đó sử dụng '$ cmd $ args' (không có dấu ngoặc kép). Làm việc với Bourne và Korn Shell. –

+0

Trừ khi bạn đang sử dụng ksh trên linux (thử nghiệm với ksh-93s-59.7). –

0

Bạn đã thử làm theo cách khác với dấu ngoặc kép chưa? Như thế này:

 
DAEMON_OPTS='-la "/folder with space/"' 

Tôi không chắc chắn, nhưng điều đó có thể hiệu quả?

(Tôi đã đăng nội dung này làm nhận xét cho câu trả lời trước đó, nếu tôi chỉ có đủ danh tiếng để làm như vậy).

+0

Tôi đã thử điều đó và bất kỳ sự kết hợp báo giá nào khác mà tôi biết ... không may mắn. –

0

Bất cứ khi nào bạn có biến bash có dấu cách, hãy đảm bảo bạn sử dụng dấu ngoặc kép khi đề cập đến nó.

start-stop-daemon --start --make-pidfile --pidfile $ PID --exec $ DAEMON - "$ DAEMON_OPTS"

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