Làm cách nào để kiểm tra bash nếu shell đang chạy trong chế độ tương tác?


46

Làm thế nào tôi có thể nói (trong ~/.bashrc) nếu tôi đang chạy trong chế độ tương tác, hoặc, giả sử, thực thi một lệnh trên ssh. Tôi muốn tránh việc in các chuỗi thoát ANSI .bashrcnếu đó là trình tự sau.


Việc chọn có in các chuỗi thoát hay không tốt hơn là dựa trên giá trị $ TERM và không dựa trên tính tương tác của vỏ. Biến xác định các khả năng của thiết bị đầu cuối khách hàng là phần diễn giải các chuỗi thoát.
yrk

Câu trả lời:


53

Theo man bash:

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.

Vì vậy, bạn có thể sử dụng:

if [[ $- == *i* ]]
then
    do_interactive_stuff
fi

Cũng thế:

Khi một vỏ tương tác không phải là vỏ đăng nhập được khởi động, bash sẽ đọc và thực thi các lệnh từ /etc/bash.bashrc và ~ / .bashrc, nếu các tệp này tồn tại.

Vì vậy, ~/.bashrcchỉ có nguồn gốc cho vỏ tương tác. Đôi khi, mọi người lấy nó từ ~/.bash_profilehoặc ~/.profilekhông chính xác vì nó can thiệp vào hành vi dự kiến. Nếu bạn muốn đơn giản hóa việc bảo trì mã phổ biến, bạn nên sử dụng một tệp riêng để chứa mã chung và nguồn độc lập với cả hai tệp RC.

Tốt nhất là nếu không có đầu ra cho thiết bị xuất chuẩn từ rccác tệp đăng nhập như ~/.bash_profilehoặc ~/.profilevì nó có thể can thiệp vào hoạt động đúng của rsyncví dụ.

Trong mọi trường hợp, vẫn nên kiểm tra tính tương tác vì cấu hình không chính xác có thể tồn tại.


7
Lưu ý rằng $ - có thể chứa một i, không nhất thiết phải bằng nó. Tôi sử dụng[[ $- =~ i ]] && echo interactive
Alex Howansky

1
@AlexHowansky: các dấu sao trong bài kiểm tra đẳng thức làm cho nó trở thành một bài kiểm tra để chứai
Dennis Williamson

Oh wow thậm chí không nhận thấy những cái đó, chúng trông giống như trích dẫn kép trên màn hình của tôi. Nó có thể là thời gian để tăng kích thước phông chữ. <già đi>
Alex Howansky

Đôi khi, mọi người lấy nó từ ~/.bash_profilehoặc ~/.profilekhông chính xác vì nó can thiệp vào hành vi được mong đợi . Bạn nghĩ gì về nguồn hàng ~/.bashrctừ ~/.bash_login? Vì shell đăng nhập không cần phải tương tác, tôi đoán nó cũng không chính xác.
Piotr Dobrogost

1
@PiotrDobrogost: Đây là một cuộc thảo luận tuyệt vời về các tệp khởi động shell.
Dennis Williamson

12

Sử dụng:

if tty -s; then echo interactive; fi

Dường như không hoạt động
Steven Shaw

điều này dường như cũng không hiệu quả với tôi, tôi nghĩ đây là câu trả lời đúng: stackoverflow.com/a/49064632/1223975
Alexander Mills

kiểm tra này cho sự hiện diện của một TTY trên đầu vào tiêu chuẩn; mặc dù nó có thể liên quan nhưng nó không giống như chế độ tương tác của shell, được biểu thị bằng cờ "-i" của shell.
yrk

không làm việc. Tại sao mọi người nâng cao?
Setop

11

các testcông cụ có thể kiểm tra này (từ trang người đàn ông):

 -t FD          True if FD is opened on a terminal.

Vì vậy, bạn có thể sử dụng ví dụ:

 if [ -t 0 ] ; then
    echo stdin is a terminal
   .....
 fi

hoặc là

if [ -t 1 ] ; then
    echo stdout is a terminal
 fi

Đẹp và dường như là di động giữa các vỏ. KIỂM TRA nó bash <<< 'test -t 0 && echo Y || echo X'viết Y, bash -c 'test -t 0 && echo Y || echo X'viếtX
kyb

1
điều này cũng xác minh rằng đầu vào tiêu chuẩn là một TTY; mặc dù nó có thể liên quan nhưng nó KHÔNG giống như chế độ tương tác của shell, được yêu cầu và biểu thị bằng cờ "-i" của shell.
yrk

6

Tôi thường nhìn vào đầu ra của chương trình tty.

Nếu bạn đang ở trên một tty, nó sẽ cho bạn biết bạn đang ở đâu. Nếu bạn không ở chế độ tương tác, nó thường sẽ cho bạn biết một cái gì đó như "không phải là một tty".


3
tty -s sẽ đặt giá trị trả về là 0 nếu bạn ở trên thiết bị đầu cuối hoặc 1 nếu không cho bạn đầu ra. Bạn có thể sử dụng nó như 'nếu tty -s; sau đó _ tương tác; fi '
BillThor

Cảm ơn! Đã lâu rồi tôi mới phải làm việc này và tôi đoán là tôi đã quên một số chi tiết ...
chris
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.