Bất kỳ lệnh nào trong thiết bị đầu cuối của tôi thoát với mã khác không sẽ đóng cửa sổ thiết bị đầu cuối của tôi


22

Lúc đầu, điều này hơi buồn cười, như chơi "Bash Roulette" ... nhưng bây giờ nó đã trở nên cũ rồi

Bất kỳ lệnh nào trong thiết bị đầu cuối của tôi thoát với mã khác không sẽ đóng cửa sổ thiết bị đầu cuối của tôi

Tôi đã nói rằng có lẽ tôi đã set -ethiết lập một số tập lệnh bash ở đâu đó mà các thiết bị đầu cuối của tôi.

Tôi đã kiểm tra .bash_profile/ .bashrc/ .profilevà nó không giống như set -eở đó.

Sẽ có bất kỳ thủ phạm rõ ràng khác?


7
Thực thi a set +e, nó có sửa chữa vấn đề không? Nếu vậy, mà tôi giả sử, thì bạn cần tiếp tục tìm kiếm điều đó set -e. Nó có thể là trong các phiên bản toàn cầu của các tệp này /etchoặc trong bất kỳ tập lệnh nào khác có nguồn gốc từ chúng. Di chuyển các tập tin cấu hình của bạn đi, nếu vấn đề được khắc phục, sau đó thêm lại các dòng trong các phần nhỏ hơn để xem nơi nó bị hỏng.
egmont

3
PS4=' ${BASH_SOURCE}:$LINENO: ' bash -lixc true |& grep -e set -e trapcó thể là thông tin.
muru

Bạn có thể kiểm tra tập hợp các cờ shell hiện được bật bằng biến đặc biệt -như vậy : echo $-.
David Foerster

Câu trả lời:


21

Được rồi, thực sự, đó là một cách bướng bỉnh set -egây ra rắc rối của tôi.

Cách tôi tìm thấy set -eđang sử dụngbash -lx

Điều tốt nhất để làm là sử dụng:

bash -lx > lx.log 2>&1

sau đó mở tệp nhật ký đó và thực hiện tìm kiếm set...

một khi bạn thấy rằng bướng bỉnh set -ebạn có thể loại bỏ dòng đó và vấn đề của bạn sẽ biến mất! (Khởi động lại máy có thể là một ý tưởng tốt tho).

Trong trường hợp của tôi, set -etệp nằm trong một tệp có nguồn .bash_profile, nhưng dòng không nằm trong chính .bash_profile.


3
Những thứ an toàn sourcetrong shell của bạn là một tập hợp nhỏ hơn nhiều so với chỉ "tập lệnh shell ngẫu nhiên". -ecó thể hữu ích trong các tập lệnh thực tế, để kiểm tra lỗi câm. (Hoặc để đảm bảo bạn không quên kiểm tra lỗi bất cứ điều gì.)
Peter Cordes

Rõ ràng đó là trường hợp ... tôi ước có một cái gì đó giống như global set -evậy set -echỉ ảnh hưởng đến tập lệnh chứa
Alexander Mills

@AlexanderMills, để làm điều đó, bạn có thể kiểm tra $-để kiểm tra cờ trong tập lệnh bên trong và khôi phục trạng thái của nó ở cuối hoặc chỉ đặt lại ở tập lệnh chính nếu bạn biết bạn có tập lệnh có nguồn gốc sẽ đặt nó
ilkkachu

Vì vậy, tôi đoán local set -echỉ có thể được sử dụng trong một hàm bash?
Alexander Mills

13

Nếu bạn chỉ muốn giải quyết vấn đề, hãy đưa set +evào .bashrc- ở cuối.

Bạn có thể đi đào ở đây, có rất nhiều nơi khác set -ecó thể là một khu vực nhưng điều đó sẽ giúp bạn rất nhiều.

Tuy nhiên, nếu set -elà một phần của bạn $PROMPT_COMMANDthì những thứ trên sẽ không hoạt động. Hãy thử printf '%s\n' "$PROMPT_COMMAND"và xem những gì trong đó.


trên máy của tôi, khi tôi mở một thiết bị đầu cuối, printf '%s\n' "$PROMPT_COMMAND"chỉ mang lại khoảng trắng, không có gì ở đó
Alexander Mills

@AlexanderMills, thì đó không phải là vấn đề của bạn. Một cách sử dụng phổ biến $PROMPT_COMMANDlà cập nhật tên tab thiết bị đầu cuối hoặc tên cửa sổ; MacOS X và Ubuntu đều làm điều này. Xem apple.stackexchange.com/q/220641/151730 để biết dữ liệu về điều này cho Mac.
tự đại diện

Tôi tìm thấy một câu trả lời cho vấn đề này và thêm vào câu trả lời của riêng tôi, set +ekhông làm việc, có lẽ vì đó là trước khi các set -ecuộc gọi trong file bash sourced tôi.
Alexander Mills

1
@AlexanderMills, vâng, tôi nghĩ đó là ngầm. Tôi có nghĩa là để thêm set +e vào của bạn .bashrc, không đưa nó vào lúc bắt đầu. Tôi đã nói rõ điều đó trong câu trả lời của tôi bây giờ. Thật tốt khi bạn tìm thấy nguồn!
tự đại diện

Vâng, set +erõ ràng chỉ là một hỗ trợ ban nhạc, nhưng bạn đã nói rằng
Alexander Mills
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.