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 .bashrc
nếu đó là trình tự sau.
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 .bashrc
nếu đó là trình tự sau.
Câu trả lời:
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, ~/.bashrc
chỉ có nguồn gốc cho vỏ tương tác. Đôi khi, mọi người lấy nó từ ~/.bash_profile
hoặc ~/.profile
khô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ừ rc
các tệp đăng nhập như ~/.bash_profile
hoặc ~/.profile
vì nó có thể can thiệp vào hoạt động đúng của rsync
ví 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.
[[ $- =~ i ]] && echo interactive
i
~/.bash_profile
hoặc ~/.profile
khô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 ~/.bashrc
từ ~/.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.
Sử dụng:
if tty -s; then echo interactive; fi
các test
cô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
bash <<< 'test -t 0 && echo Y || echo X'
viết Y
, bash -c 'test -t 0 && echo Y || echo X'
viếtX
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".