thực thi tập lệnh bash bên trong .bashrc


7

Xin chào Tôi tò mò nếu có thể thực thi một tập lệnh bash bên trong bash rc. Nó dường như sẽ tạo ra một vòng lặp vô hạn trừ khi có một số cách để bảo nó không thử và bắt đầu một vỏ mới.

Đây là một ví dụ

bash_script.sh:

#!/bin/bash
echo Hello World

.bashrc

export HELLO_WORLD=$(bash_script.sh)    

Câu trả lời:


3

Một tập lệnh được thực thi bởi trình bao không tương tác, trong khi .bashrcchỉ được tự động lấy nguồn bởi các trình bao tương tác.


Tuy nhiên, có một cách để kích hoạt một vòng lặp vô hạn. Mỗi bash shell, tương tác hay không, kiểm tra xem biến BASH_ENVcó được đặt hay không và nếu có, sử dụng giá trị của nó làm tên của tệp để nguồn. Trong trường hợp này, việc thực thi một bashtập lệnh từ tệp này sẽ dẫn đến vòng lặp vô hạn, do đó phải được thực hiện. Tuy nhiên, trong thực tế, tập lệnh này (như tên gọi của nó) chỉ đơn giản được sử dụng để đặt các biến môi trường để sử dụng bởi trình bao, không thực thi mã tùy ý.


Vì vậy, làm thế nào có thể ngăn chặn một vòng lặp vô hạn như vậy?
aggieol

2

Ok tôi đã tìm ra cách để làm điều này. Trong .bashrc chỉ cần làm:

export HELLO_WORLD=$(source bash_script.sh)

3
Không có lý do gì, theo như tôi có thể nói, để bạn gán nó kết quả của tập lệnh đó cho một biến. Bạn có thể dễ dàng có dòng source bash_script.shtrong.bashrc
HalosGhost

2

Bạn không cần phải làm bất cứ điều gì. Chỉ cần khởi chạy một tập lệnh bash sẽ không khiến cho bạn .bashrcđược gọi.

Lần duy nhất bạn .bashrcsẽ được gọi là nếu bash tương tác. Khi bạn khởi chạy một tập lệnh, tập lệnh đó không tương tác.

Từ trang bash man:

Một vỏ tương tác được bắt đầu mà không có đối số không phải tùy chọn và không có tùy chọn -c có đầu vào và lỗi tiêu chuẩn đều được kết nối với các thiết bị đầu cuối (như được xác định bởi isatty (3)) hoặc bắt đầu bằng tùy chọn -i. PS1 được đặt và $ - bao gồm i nếu bash tương tác, cho phép tập lệnh shell hoặc tệp khởi động để kiểm tra trạng thái này.

Bit quan trọng ở đây là "bắt đầu mà không có đối số không tùy chọn". Khi bạn khởi chạy một tập lệnh, đối số đầu tiên để bash là đường dẫn đến tập lệnh đó. Do đó, nó có một đối số không tùy chọn và không tương tác.


1

Đặt cái này là dòng 1:

[ -z "$PS1" ] && return # If not interactive, exit

1
Đây không phải là một thử nghiệm rất tốt vì PS1có thể được đặt ngay cả trong chế độ không tương tác. Cách để kiểm tra chế độ tương tác trong bash là bằng cách thực hiện[[ "$-" == *i* ]] && echo "I'm interactive"
Patrick
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.