Tại sao tập lệnh bash này gây ra lỗi trên Ubuntu mà không phải là OSX


1
#!/usr/bin/env sh
export $NODE_CONFIG_DIR=/Users/full/path/to/script/config
cd /Users/full/path/to/script
/usr/local/bin/node main

Tập lệnh chạy cục bộ trên OSX (nếu tôi điều chỉnh các đường dẫn cho môi trường cục bộ) nhưng trên Ubuntu tôi nhận được:

./mtf_runner.sh: 2: export: : bad variable name

Tôi muốn chạy tập lệnh bằng cron và cần đặt NODE_CONFIG_DIRbiến môi trường

Ngoài ra, mặc dù lệnh chạy crontrên OSX (10.8.5), tôi vẫn nhận được những điều sau đây được gửi đến thư cục bộ của mình:

line 2: export: `=/Users/myname/Node/Development/tennistracker/config': not a valid identifier

Tôi đã đọc rằng điều này có thể được gây ra bởi một không gian xung quanh =nhưng chắc chắn không có không gian


Một tập lệnh xác định #!/usr/bin/env shlà trình thông dịch tập lệnh của nó không phải là tập lệnh bash , không phải trên Ubuntu , không phải trên Debiankhông phải trên NetBSD .
JdeBP

Câu trả lời:


4

Điều này được gây ra bởi thực tế là khi đặt một biến, bạn không nên đặt tiền tố với $. Ở đây, $ NODE_CONFIG_DIR được mở rộng thành không có gì (vì nó không được đặt) trước khi chạy dòng, điều này khiến bạn chạy export =/Users/full/path/to/script/config. Kịch bản nên

#!/usr/bin/env sh
export NODE_CONFIG_DIR=/Users/full/path/to/script/config
cd /Users/full/path/to/script
/usr/local/bin/node main

0

Mặc dù cách sử dụng tránh "$" làm tiền tố biến là chính xác, có một sự khác biệt khác. Trên các hệ thống OSX, 'sh' là 'bash'. Đó là, nó là một loại vỏ Bourne. Điều này có thể được xác minh trên Mac bằng cách thực hiện

man sh

Trên Ubuntu, 'sh' là 'dash'. Dash là loại vỏ Korn. Bạn cũng có thể thấy điều này qua trang 'người đàn ông' hoặc bằng cách thực hiện:

ls -al /bin/sh

Vì vậy, nếu bạn muốn đảm bảo rằng các tập lệnh của bạn hoạt động giống nhau trên cả hai hệ thống, hãy thực hiện:

#!/usr/bin/env bash

thay vì 'sh' bình thường.

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.