Tại sao mở rộng tham số bash không hoạt động trong các tệp dịch vụ systemd?


14

Tôi cố gắng để sử dụng systemd's EnvironmentFilevà thêm tùy chọn vào lệnh khi nó được thiết lập trong file. Tôi có các mục sau trong tập tin đơn vị:

ExecStart=/usr/bin/bash -c "echo ${PORT:+port is $PORT}"

mà không lặp lại bất cứ điều gì khi tôi bắt đầu dịch vụ.

Các công việc sau đây như mong đợi:

ExecStart=/usr/bin/bash -c "echo port is $PORT"

có nghĩa là các tập tin được đọc chính xác.

Thay thế tham số cũng hoạt động trên dòng lệnh:

$ PORT=1234 bash -c 'echo ${PORT:+port is $PORT}'
port is 1234

Tôi đang thiếu gì?

Câu trả lời:


27

systemd thực hiện phân tích cú pháp dòng lệnh shell tối giản của riêng nó về nội dung ExecStart=và các tham số khác. Phân tích cú pháp tối giản này hỗ trợ thay thế biến môi trường cơ bản nhưng dường như không phải là thứ như thế ${PORT:+port is $PORT}.

Bạn sẽ muốn ngăn systemd thực hiện điều đó và để shell được gọi xử lý nó.

Từ tài liệu:

Để vượt qua ký hiệu đô la theo nghĩa đen, hãy sử dụng " $$".

Vì vậy, hãy thử điều này:

ExecStart=/usr/bin/bash -c "echo $${PORT:+port is $$PORT}"

Hoặc tốt hơn nữa, hãy thử điều này:

ExecStart=/bin/sh -c "echo $${PORT:+port is $$PORT}"

bởi vì kiểu mở rộng biến bạn đang thực hiện ở đây là tiêu chuẩn POSIX và không phải là bash-ism. Bằng cách sử dụng /bin/shthay vì bashbạn sẽ loại bỏ một phụ thuộc không cần thiết vào bash.

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.