Câu hỏi Chọn giữa .bashrc, .profile, .bash_profile, v.v. [trùng lặp]


Câu hỏi này đã có câu trả lời ở đây:

Đây là điều đáng xấu hổ, nhưng sau nhiều năm sử dụng hệ thống POSIX toàn thời gian, tôi vẫn có một thời gian khó khăn để xác định xem có nên tùy chỉnh vỏ hay không .bashrc, .profile, Hay ở đâu đó khác. Chưa kể đến một số tệp cấu hình dành riêng cho hệ điều hành như .pam_environment.

Vâng, tôi biết cách giải đố qua tài liệu và tìm hiểu khi nào mỗi tệp được tải hoặc không được tải. Những gì tôi đang tự hỏi là nếu có ai đã đặt tất cả các hướng dẫn toàn diện với nhau làm thế nào để quyết định tập tin để đặt một loại tùy chỉnh nhất định trong.


169
2017-07-29 03:14


gốc


câu hỏi này không nên được đánh dấu là trùng lặp lý do là .profile không có sẵn trong câu hỏi được thêm vào. - Premraj
Trả lời: serverfault.com/q/261802/270464 - Premraj


Các câu trả lời:


TL; DR:

  • ~/.bash_profile nên siêu đơn giản và chỉ tải .profile và .bashrc (theo thứ tự đó)

  • ~/.profile có những thứ KHÔNG cụ thể liên quan đến bash, chẳng hạn như biến môi trường (PATH và những người bạn)

  • ~/.bashrc có bất cứ điều gì bạn muốn ở một dòng lệnh tương tác. Dấu nhắc lệnh, EDITOR biến bí danh bash cho sử dụng của tôi

Một vài lưu ý khác:

  • Mọi thứ cần có sẵn cho các ứng dụng đồ họa HOẶC đến sh (hoặc bash được gọi là sh) PHẢI ở trong ~/.profile

  • ~/.bashrc không được xuất ra bất cứ thứ gì

  • Mọi thứ chỉ có sẵn cho các shell đăng nhập nên đi vào ~/.profile

  • Đảm bảo rằng ~/.bash_login không tồn tại.


190
2017-07-29 04:27



+1, điều này cho phép ~/.profile để đặt chính xác môi trường cho các dịch vụ như GDM / LightDM / LXDM chạy rõ ràng / bin / sh. - grawity
Của tôi .bashrc đầu ra khá nhiều thứ, bạn có thể bình luận về điều đó không? Đặc biệt, tôi nên đặt đầu ra lời chào ở đâu? - Calimo
@Calimo: Làm cho nó chỉ công cụ đầu ra trong chế độ tương tác. Bạn có thể kiểm tra nó bằng cách sử dụng [[ $- == *i* ]], đó là, tìm kiếm 'i' trong phần đặc biệt $- biến. Tất nhiên, nó chỉ quan trọng ở nơi đầu tiên trên các hệ thống mà bash được biên dịch để đọc .bashrc ở chế độ không tương tác. (Đó là Debian nhưng không phải Arch). Nhưng đó là nguyên nhân thường gặp của các thông báo lỗi bí ẩn khi cố gắng kết nối bằng sftp hoặc là scp hoặc các công cụ tương tự. - grawity
Bây giờ tôi phải biết - tại sao nên. Bash_login không tồn tại? Nó làm gì? - tedder42
@ tedder42: Nó cũng giống như .bash_profile và .profile. Nhưng bash chỉ đọc cái đầu tiên trong số ba. Có nghĩa là, nếu bạn có .bash_login, sau đó cả hai .profile và .bash_profile sẽ bị bỏ qua một cách bí ẩn. - grawity


Trong vài năm qua, tôi đã có rất nhiều thời gian để lãng phí, vì vậy tôi  nghiên cứu điều này một chút chỉ hơn 10 phút. Tôi không có ý tưởng nếu đây là cách bố trí tốt nhất, nó chỉ là một trong đó xảy ra để làm việc một cách chính xác trong khá nhiều tất cả các trường hợp.

Các yêu cầu:

  • ~/.profile phải tương thích với bất kỳ / bin / sh - điều này bao gồm bash, dấu gạch ngang, ksh, bất cứ điều gì khác một distro có thể chọn để sử dụng.

  • Biến môi trường phải được đặt trong một tệp được đọc bởi cả đăng nhập bảng điều khiển (ví dụ: vỏ đăng nhập ') và thông tin đăng nhập đồ họa (tức là trình quản lý hiển thị như GDM, LightDM hoặc LXDM).

  • Có rất ít điểm trong việc cả hai  ~/.profile và ~/.bash_profile. Nếu sau này bị thiếu, bash sẽ vui vẻ sử dụng trước đây, và bất kỳ dòng cụ thể bash có thể được bảo vệ với một kiểm tra cho $BASH hoặc là $BASH_VERSION.

  • Sự tách biệt giữa *profile và *rc là trước đây được sử dụng cho vỏ 'đăng nhập', và sau đó mỗi lần bạn mở một cửa sổ đầu cuối. Tuy nhiên, bash trong chế độ 'đăng nhập' không phải là nguồn ~/.bashrc, vì thế ~/.profile cần phải làm điều đó bằng tay.

Các đơn giản nhất cấu hình sẽ là:

  • Có một ~/.profile đặt tất cả các biến môi trường (trừ các biến môi trường cụ thể), có thể in một hoặc hai dòng, sau đó là nguồn ~/.bashrc nếu được chạy bằng bash, bám theo cú pháp tương thích với sh.

    xuất khẩu TZ = "Châu Âu / Paris"
    xuất EDITOR = "vim"
    nếu ["$ BASH"]; sau đó
        . ~ / .bashrc
    fi
    thời gian hoạt động
    
  • Có một ~/.bashrc thực hiện bất kỳ thiết lập cụ thể cho trình bao nào, được bảo vệ bằng séc chế độ tương tác để tránh phá vỡ những thứ như sftp trên Debian (nơi bash được biên dịch với tùy chọn tải ~/.bashrcngay cả đối với các shell không tương tác):

    [[$ - == * i *]] || trả về 0
    
    PS1 = '\ h \ w \ $'
    
    start () {sudo service "$ 1" bắt đầu; }
    

Tuy nhiên, cũng có vấn đề là một số lệnh không tương tác nhất định (ví dụ: ssh <host> ls) bỏ qua ~/.profile, nhưng các biến môi trường sẽ rất hữu ích cho chúng.

  • Một số bản phân phối nhất định (ví dụ Debian) biên dịch bash của chúng với tùy chọn nguồn ~/.bashrc cho các thông tin đăng nhập không tương tác như vậy. Trong trường hợp này, tôi thấy hữu ích khi di chuyển tất cả các biến môi trường ( export ... dòng) vào một tệp riêng biệt, ~/.environvà tìm nguồn từ cả hai  .profile và .bashrc, với một người bảo vệ để tránh làm điều đó hai lần:

    nếu ! ["$ PREFIX"]; sau đó # hoặc $ EDITOR hoặc $ TZ hoặc ...
        . ~ / .environ # thường là bất kỳ biến nào mà chính .environ sẽ đặt
    fi
    
  • Thật không may, đối với các bản phân phối khác (ví dụ: Arch), tôi đã không tìm thấy một giải pháp tốt. Một khả năng là sử dụng mô-đun Pam_env PAM (được bật theo mặc định), bằng cách đặt các mục sau vào ~/.pam_environment:

    BASH_ENV =. /. # không phải lỗi đánh máy; nó cần phải là một con đường, nhưng ~ sẽ không hoạt động
    

    Sau đó, tất nhiên, đang cập nhật ~/.environ đến unset BASH_ENV.


Phần kết luận? Vỏ là một nỗi đau. Biến môi trường là một cơn đau. Các tùy chọn biên dịch thời gian phân phối cụ thể là một bao la đau ở mông.


45
2017-07-29 15:28



1 cho đoạn cuối, nhưng tôi thích tìm nguồn cung ứng .profile và .bashrc từ .bash_profile và giữ .profile dọn dẹp. - nyuszika7h
@ nyuszika7h: My .profile  sạch sẽ, cảm ơn. - grawity
Lưu ý nhận xét lại mỗi khi bạn mở một cửa sổ là cách khác vòng cho OSX - Mark
"Có rất ít điểm trong việc có cả hai ~/.profile và ~/.bash_profile": Tôi không đồng ý. Xem câu trả lời của Dan cho lý do tại sao. - rubenvb
@ rubenvb Bạn có thể trích dẫn phần liên quan không? Tôi nghĩ rằng chỉ có một .profile và bảo vệ bashcác bộ phận cụ thể với điều kiện. - Kelvin


Có một cái nhìn tại đây bài đăng trên blog tuyệt vời của ShreevatsaR. Đây là một trích xuất, nhưng đi đến bài đăng blog, nó bao gồm một lời giải thích cho các thuật ngữ như "đăng nhập shell", một biểu đồ dòng chảy, và một bảng tương tự cho Zsh.

Đối với Bash, chúng hoạt động như sau. Đọc xuống cột thích hợp. Thực thi A, rồi B, rồi C, vv. B1, B2, B3 có nghĩa là nó chỉ thực thi đầu tiên của những tệp được tìm thấy.

+----------------+-----------+-----------+------+
|                |Interactive|Interactive|Script|
|                |login      |non-login  |      |
+----------------+-----------+-----------+------+
|/etc/profile    |   A       |           |      |
+----------------+-----------+-----------+------+
|/etc/bash.bashrc|           |    A      |      |
+----------------+-----------+-----------+------+
|~/.bashrc       |           |    B      |      |
+----------------+-----------+-----------+------+
|~/.bash_profile |   B1      |           |      |
+----------------+-----------+-----------+------+
|~/.bash_login   |   B2      |           |      |
+----------------+-----------+-----------+------+
|~/.profile      |   B3      |           |      |
+----------------+-----------+-----------+------+
|BASH_ENV        |           |           |  A   |
+----------------+-----------+-----------+------+
|                |           |           |      |
+----------------+-----------+-----------+------+
|                |           |           |      |
+----------------+-----------+-----------+------+
|~/.bash_logout  |    C      |           |      |
+----------------+-----------+-----------+------+

29
2017-07-29 03:39



Cái này đẹp đấy. Điều quan trọng cần lưu ý là thường /etc/profile cuộc gọi /etc/bash.bashrcvà ~/.profile cuộc gọi ~.bashrc. Vì vậy, hiệu quả, /etc/bash.bashrc và ~/.bashrc đang được thực hiện cho Tương tác đăng nhập. - wisbucky
Lưu ý rằng một số bản phân phối dường như ghi đè lược đồ này (với các hậu quả lạ) - xem ví dụ: bugreport của tôi sẽ mở ra ở đây: bugzilla.opensuse.org/show_bug.cgi?id=1078124 - Christian Herenz


Tôi cung cấp cho bạn các nguyên tắc "toàn diện" của tôi:

  • Chế tạo .bash_profile và .profile tải trọng .bashrc nếu nó tồn tại, sử dụng ví dụ: [ -r $HOME/.bashrc ] && source $HOME/.bashrc
  • Đặt mọi thứ khác vào .bashrc.
  • Đưng lo lăng.
  • Mỗi bốn năm hoặc lâu hơn, dành mười phút nghiên cứu câu hỏi này trước khi bỏ cuộc và trở lại "không đáng lo ngại".

EDIT: Thêm báo giá sợ hãi để "toàn diện" chỉ trong trường hợp bất cứ ai là cám dỗ để tin tưởng nó. ;)


19
2017-07-31 02:45



Có cả hai .bash_profile và .profile là một chút dư thừa; bạn chỉ cần cái sau. Bạn cần phải làm cho nó / bin / sh-proof, mặc dù: if [ "$BASH" ] && [ -r ~/.bashrc ]; then . ~/.bashrc; fi, vì có các chương trình (cụ thể là gdm / lightdm) tự nguồn tập tin từ tập lệnh / bin / sh. Điều này cũng có nghĩa là môi trường được lưu giữ trong .bashrc sẽ không hiệu quả. Đã phải -1, vì nguyên tắc "toàn diện" của bạn sẽ không hoạt động trên nhiều hệ thống, vì tôi đã tìm ra cách khó khăn nhiều lần. - grawity
Không có vấn đề gì, tôi vui vẻ trả một -1 cho một câu trả lời không chỉ đơn thuần là lưỡi "toàn diện", và bạn chắc chắn đã giành được danh hiệu đó. - Mechanical Fish


Tôi đã từ bỏ việc cố gắng tìm ra cái này và tạo ra một kịch bản (~/.shell-setup) mà tôi nguồn từ tất cả những người khác.

Cách tiếp cận này yêu cầu ~/.shell-setup có hai tính năng:

  1. Chỉ chạy một lần, ngay cả khi có nguồn liên tục (sử dụng Bao gồm bảo vệ)
  2. Không tạo ra bất kỳ đầu ra không mong muốn nào (phát hiện khi đầu ra là ok)

# 1 là khá chuẩn, mặc dù có thể không được sử dụng nhiều trong các kịch bản shell.

# 2 là phức tạp hơn. Đây là những gì tôi sử dụng trong bash:

if [ "" == "$BASH_EXECUTION_STRING" -a "" == "$DESKTOP_SESSION" ]; then
    echo "Hello user!" # ... etc
fi

Thật không may tôi không nhớ làm thế nào tôi đã đưa ra điều đó, hoặc tại sao phát hiện một vỏ tương tác không đủ.


0
2017-07-29 03:50





Đặt mọi thứ vào .bashrc và sau đó là nguồn .bashrc từ .profile

Từ trang bash man (trên OS X 10.9):

Khi một shell tương tác không phải là một shell đăng nhập được khởi động, bash đọc và thực hiện các lệnh từ ~ / .bashrc, nếu tập tin đó tồn tại. Điều này có thể bị ức chế bằng cách sử dụng tùy chọn --norc. Tùy chọn tệp --rcfile sẽ buộc bash để đọc và thực thi lệnh từ tệp thay vì ~ / .bashrc

Các văn bản trên là lý do tại sao tất cả mọi thứ được đưa vào .bashrc. Tuy nhiên, có một chút khác biệt khi bạn xử lý một shell đăng nhập. Một lần nữa, trích dẫn từ trang người đàn ông:

Khi bash được gọi là một shell đăng nhập tương tác, hoặc là một shell không tương tác với tùy chọn --login, nó đầu tiên đọc và thực hiện các lệnh từ tập tin / etc / profile, nếu tập tin đó tồn tại. Sau khi đọc tệp đó, nó tìm kiếm ~ / .bash_profile, ~ / .bash_login và ~ / .profile, theo thứ tự đó, và đọc và thực hiện các lệnh từ lệnh đầu tiên tồn tại và có thể đọc được. Tùy chọn --noprofile có thể được sử dụng khi trình bao bắt đầu ngăn chặn hành vi này.

.profile được đọc cho các shell đăng nhập, nhưng .bashrc không phải là. Sao chép tất cả nội dung đó trong .bashrc là xấu vì vậy chúng tôi cần phải nguồn nó trong .profile để hành vi duy trì tính nhất quán.

Tuy nhiên, bạn không muốn nguồn .bashrc từ .profile vô điều kiện. Vui lòng xem các nhận xét và các câu trả lời khác để biết thêm chi tiết.


-1



-1, ĐỪNG nguồn .bashrc từ .profile. Xem câu trả lời của @ DanRabinowitz. - nyuszika7h
Ít nhất là không vô điều kiện. - nyuszika7h
[ -n "$BASH" -a -f ~/.bashrc ] && . ~/.bashrc sẽ là một người say mê ngọt ngào cho .profile. - John WH Smith
@ nyuszika7h, Tại sao không? Mọi người dường như để đề nghị làm như vậy. - Pacerier