Ubuntu bash script: shell đang thay đổi mà không có lý do


0

Tôi đang có một hành vi lạ với tập lệnh shell trên Ubuntu 12.04.1 LTS.

Kịch bản của tôi dự kiến ​​sẽ được phát hành mỗi giờ (trong crontab). Nó sử dụng / bin / bash, nhưng đôi khi nó chuyển sang / bin / sh mà không có lý do.

Dưới đây là một số phần của lệnh env mà tôi đang đăng nhập từ trong tập lệnh.

Câu trả lời đúng là:

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/opt/jdk/jdk1.6.0_35/bin

Cái sai đôi khi xảy ra là:

SHELL=/bin/sh
PATH=/usr/bin:/bin

Vấn đề là tôi đang mất biến PATH và tôi gặp lỗi khi tôi cố chạy lệnh.

Có gợi ý nào không? Cảm ơn!


2
Bạn đã bắt đầu kịch bản của bạn với #!/bin/bash?

$ PATH đầu tiên là một cho người dùng của bạn, $ PATH thứ hai là một cho cron. Tạo một trình bao bọc cron nhỏ khởi chạy / bin / bash và thiết lập $ PATH dự kiến ​​của bạn.
cdleonard

Câu trả lời:


2

Thật khó để nói tại sao đôi khi nó hoạt động và đôi khi không. Vì vậy, đây là một số ý tưởng có thể hoặc có thể không giúp đỡ.

Kiểm tra tập lệnh của bạn bắt đầu bằng

#!/bin/bash

và đảm bảo tập lệnh được chạy với đúng người dùng: Điều này sẽ khiến bash tải đúng môi trường cho người dùng đó.

Nếu bạn muốn đi chắc chắn, bạn cũng có thể rõ ràng chạy bashtrong của bạn crontab, sau đó vượt qua kịch bản để chạy với các -cđối số.

Nếu điều đó không giúp ích và bạn cần sửa chữa nhanh, bạn có thể chọn chạy các lệnh trong tập lệnh của mình bằng đường dẫn đầy đủ của chúng, vì vậy bạn hoàn toàn không cần chính xác PATH.

Lưu ý bên lề: Câu hỏi này sẽ phù hợp hơn với Server Fault hoặc Unix và Linux.


Cảm ơn, tập lệnh bắt đầu bằng khai báo / bin / bash. Tuy nhiên, tôi đã tìm thấy một số cách giải quyết khắc phục sự cố như những vấn đề bạn đang đề xuất. Tôi không thể giải thích tại sao điều này lại xảy ra ...
Angelo Cavallini

0

Đặt điều này ngay khi bắt đầu kịch bản của bạn:

#!/bin/bash
if [ "$(readlink -f /proc/$$/exe)" != "/bin/bash" ] ; then
    echo restarting script with bash... > &2
    exec /bin/bash $0 "$@"
fi

0

Các SHELLbiến là vỏ đăng nhập, không nhất thiết phải là vỏ bạn hiện đang chạy dưới.

Lý do rất có thể cho sự khác biệt là đôi khi bạn đang chạy từ một vỏ tương tác, và đôi khi không (cron), trong mỗi trường hợp các tệp khởi động được chạy là khác nhau.

Khi bạn chạy theo cron, nó không phải là một vỏ đăng nhập, vì vậy bạn .profilekhông được chạy - lý do rất có thể khiến bạn PATHkhác biệt.

Khi bắt đầu tập lệnh của bạn, hãy đặt:

source ~/.profile

(hoặc sử dụng .thay vì source)

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.