Để xuất hoặc không xuất biến bash PS1


9

Tôi chỉ dành nhiều thời gian để đọc các shell đăng nhập và tương tác và tại sao người ta nên hoặc không nên đặt các biến môi trường, hàm shell, v.v. trong các tệp hồ sơ và bashrc khác nhau. Trong bài đăng này, nó đã được đề cập rằng những thứ cụ thể như bash nên được đặt trong ~ / .bashrc. Điều đó khiến tôi băn khoăn về biến PS1. Trong tất cả các ví dụ tôi đã thấy liên quan đến điều này, họ có một cái gì đó như thế export PS1="". Điều này thực sự nên được xuất khẩu ra môi trường vì nó chỉ có ý nghĩa cho bash? Chỉ cần có PS1=""~ / .bashrc của tôi tạo ra hiệu ứng mong muốn cho tôi, nhưng tôi tự hỏi liệu tôi có thiếu thứ gì không.

Câu trả lời:


13

Điều đó đúng: PS1chỉ có ý nghĩa trong các trường hợp tương tác của bash, vì vậy nó nên được đặt ~/.bashrcvà không nên xuất. PS1cũng có ý nghĩa trong các shell khác, nhưng nó có một ý nghĩa khác, bởi vì mở rộng nhanh chóng khác nhau giữa các shell. Trong thực tế, ngay cả giữa các trường hợp bash, PS1có thể có ý nghĩa khác nhau, vì ý nghĩa phụ thuộc vào các tùy chọn shell (ít nhất promptvars).

Xuất khẩu PS1ra môi trường từ .profilenăm 1970 trở lại đây, khi chỉ có một vỏ sử dụng nó (vỏ Bourne) và nó không có tệp cấu hình. Nó vẫn hoạt động cho đến ngày hôm nay nếu bạn luôn sử dụng cùng một shell và không bao giờ cấu hình nó khác nhau. Nhưng tất cả vỏ hiện đại mà không được thiết kế hoàn toàn cho kịch bản (csh, ksh, bash, zsh, ...) đọc một tập tin cấu hình khi bắt đầu một cách tương tác ( .cshrc, .kshrc, .bashrc, .zshrc, ...), vì vậy phương pháp năm 1970 là không còn cần thiết. Cài đặt PS1và các cài đặt dành riêng cho shell khác trong tệp dành riêng cho shell và không xuất nó ra môi trường, tránh phá vỡ mọi thứ khi bạn sử dụng cấu hình shell khác hoặc shell khác hoặc thiết bị đầu cuối khác không có khả năng hiển thị lời nhắc thông thường của bạn huyền ảo. Cài đặtPS1trong một tệp dành riêng cho vỏ luôn hoạt động, trong khi cài đặt .profilevà xuất nó chỉ hoạt động trong các trường hợp đơn giản, vì vậy không có lý do gì để không thực hiện đúng cách, nhưng có rất nhiều hướng dẫn xấu trên web và thậm chí cấu hình mặc định xấu trong phân phối. C'est la vie .


Làm thế nào để xuất PS1từ .profilecông việc cho shell bash không đăng nhập vì họ sẽ không cung cấp nó? Bạn đang nói điều này sẽ hoạt động vì shell không đăng nhập sẽ được rẽ nhánh từ shell đăng nhập nên sẽ kế thừa PS1qua môi trường?
Mike Sweeney

@MikeSweeney có, đó là lý do tại sao nó được xuất khẩu .
muru

Một cách mà ý tưởng sai lệch lan truyền về việc xuất PS1 là nhìn thấy if [ -n "$PS1" ] ; then proceed assuming an INTERACTIVE shell ; fi - thường xuất hiện trong các tệp .bashrc của mọi người để chỉ tải những thứ như hoàn thành lệnh nếu đây là vỏ thiết bị đầu cuối tương tác của người dùng. Vì vậy, nhìn thấy nó hoạt động ở đó, logic tương tự xuất hiện trong các kịch bản shell, do đó "cần" để xuất nó. INSTEAD chúng ta nên kiểm tra người dùng tương tác / thiết bị đầu cuối với tty -shoặc test -t 0.
DouglasDĐ

1
@DoumundDD Thật vậy. Các PS1thử nghiệm đã được trong Debian /etc/profilecho các lứa tuổi, ví dụ. Tôi không biết nơi thực hành xấu này phát sinh. Tôi nghi ngờ nó đến từ một trường hợp sử dụng cụ thể (có thể phát hiện thông tin đăng nhập rlogin hoặc ssh?) Nơi nó xảy ra để làm việc. Thật không may, nó thất bại trong nhiều trường hợp khác, do đó nhiều câu hỏi về chủ đề này ở đây và ở nơi khác.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles nên chúng ta không xuất khẩu CLICOLORLS_COLORSmột trong hai? @DourebDD có nghĩa là if [[-z $p1]];then return fikiểm tra trong tôi .bashrclà thiếu sót?
Bắt đầu
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.