Tôi muốn bổ sung cho câu trả lời của ravi :
Hành vi này là dành riêng cho Ubuntu (và có lẽ hầu hết các bản phát hành có nguồn gốc), vì ~/.bashrc
tệp mặc định của bạn bắt đầu bằng một mạch ngắn, ví dụ Ubuntu 18.04, ví dụ:
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
Điều đó sẽ dừng việc đánh giá tệp nếu nó đang chạy trong trình bao không tương tác, đó là trường hợp tập lệnh của bạn vì tất cả các tập lệnh được chạy trong trình bao không tương tác và sau đó mọi tệp bạn source
sẽ thừa hưởng thuộc tính này.
eval
gian lận
Tôi đã phát hiện ra một bản hack xấu xí để khắc phục Ubuntu, sử dụng eval
thay vì source
:
eval "$(cat ~/.bashrc | tail -n +10)"
Nó chỉ đơn giản bỏ qua một vài dòng đầu tiên và đánh giá phần còn lại ~/.bashrc
để phần còn lại được đánh giá và sửa đổi thực thi hiện tại.
Xin lưu ý rằng đây là một con số kỳ diệu và có thể không hoạt động trên các phiên bản Ubuntu; nhưng có thể là một giải pháp tốt nếu bạn đang tạo các tập lệnh cho các hệ thống ít được biết đến.
Một giải pháp fancier có thể liên quan đến việc sử dụng regex để nhắm mục tiêu các bit cụ thể dừng đánh giá.
Shebang thay thế
Một cách khác có thể hoạt động tốt hơn trong một số trường hợp là buộc tập lệnh chạy trong trình bao tương tác bằng cách thêm cờ trong shebang :
#!/bin/bash -i
Hãy nhận biết một số điều: