Sự khác biệt giữa .bash_profile và .bashrc là gì?


245

Để tạo bí danh cho Terminal trong OS X, bạn có thể đặt bí danh vào .bash_profilehoặc .bashrc. Sự khác biệt giữa hai là gì và tại sao tôi lại chọn đặt bí danh trong một chứ không phải cái khác?


5
Không làm nản lòng kiến ​​thức unix ở đây, nhưng bash là một con thú UNIX thuần túy để bạn có thể có kiến ​​thức tốt hơn hoặc câu hỏi này được trả lời nhiều lần trên trang web đối tác. Có hơn 200 cặp câu hỏi / câu trả lời bashrc trên unix
bmike

Cũng có .profile ... Xem câu hỏi này trên Stack Overflow.
Yaakov Baruch

2
Nếu bạn brew install bashvà sử dụng iTerm2, bạn có thể thiết lập profile -> commandđể /usr/local/bin/bashmà sẽ nạp .bashrctheo mặc định sau .bash_profile. Điều này cũng mang đến cho bạn Bash 4 goodies ...
Ray Foss

Tôi nghe nói .bashrc đã không được sử dụng trong nhiều năm và theo mặc định sẽ không hoạt động và .bash_profile là thứ trong macosx. Và tôi đã thử .bashrc và tôi không làm việc cho tôi nhưng .bash_profile đã làm
barlop

Câu trả lời:


247

.bash_profileđược thực thi cho các shell đăng nhập, trong khi .bashrcđược thực thi cho các shell không đăng nhập tương tác.

Khi bạn đăng nhập (nhập tên người dùng và mật khẩu) qua bàn điều khiển, ngồi ở máy hoặc từ xa qua ssh: .bash_profileđược thực thi để định cấu hình trình bao của bạn trước dấu nhắc lệnh ban đầu.

Nhưng, nếu bạn đã đăng nhập vào máy của mình và mở một cửa sổ đầu cuối mới (xterm) thì .bashrcsẽ được thực hiện trước dấu nhắc lệnh của cửa sổ. .bashrccũng được chạy khi bạn bắt đầu một bash mới bằng cách gõ /bin/bashvào terminal.

Trên OS X, Terminal theo mặc định chạy shell đăng nhập mỗi lần, do đó, điều này hơi khác với hầu hết các hệ thống khác, nhưng bạn có thể định cấu hình nó trong tùy chọn.


57
On OS X, Terminal by default runs a login shell every time- Tôi luôn bối rối khi không nhận ra điều này. Thông tin tuyệt vời!
vaughan

1
@Alex, Tại sao thiết bị đầu cuối OS X sẽ chạy shell đăng nhập mỗi lần?
Pacerier

17
Vì một số nhà phát triển của Apple đã không nhận ra sự khác biệt ban đầu và bây giờ nó được lưu giữ trong một số mumbo jumbo.
Snowcrash

2
Tôi đang dùng OS X và tôi sử dụng zshell thay vì bash và iTerm thay vì Terminal. Mặc dù thực tế là tôi đang sử dụng một thiết bị đầu cuối khác và vỏ khác với câu trả lời thảo luận, OS X dường như vẫn đang xem xét mọi thứ là vỏ đăng nhập, bởi vì .zprofilenó được chạy mỗi lần.
Adam Zerner

1
Đối với những người tìm kiếm một lời giải thích kỹ lưỡng về sự kết hợp của các vỏ đăng nhập / không đăng nhập và tương tác / không tương tác và khi họ chạy các tệp cấu hình này, hãy xem unix.stackexchange.com/a/46856/38715
kevinmicke

45

X11 sẽ xem xét của bạn .bashrctrong khi Terminal "thông thường" sẽ xem xét.bash_profile

Tuy nhiên, nếu bạn thêm các mục sau vào .bash_profile, thì bạn có thể di chuyển mọi thứ vào .bashrctệp của mình để hợp nhất mọi thứ vào một nơi thay vì hai:

if [ -f $HOME/.bashrc ]; then
        source $HOME/.bashrc
fi

Hoặc bạn có thể làm cd ~ ; ln -s .bashrc .bash_profile.
lhf

5
2 tập tin cấu hình này có chức năng riêng biệt rõ ràng. Trong một số trường hợp, cần phải có những thứ để khởi tạo vào đầu phiên và chỉ có ở đó ( ~/.bash_profile). Nó cũng thường là cần thiết để có những thứ để xác định gia tăng ở mọi cấp độ vỏ ( ~/.bashrc). Đó không phải là ý tưởng tốt nhất để đề xuất để ngăn chặn sự tự do này.
dan

3
@danielAzuelos: Lurch đã bỏ phần này ra, nhưng nguồn OS X Terminal ~/.bash_profilecho mỗi cửa sổ / tab mới, vì vậy thực sự không có cách nào để tách hai phần xa như Terminal có liên quan.
mipadi

14
@mipadi Vẫn còn giá trị để tách chúng ra. Ví dụ, .bash_profilekhông bao giờ có thể có nguồn gốc một lần nữa trong quá trình con. Mỗi cấp độ của các nguồn Bash lồng nhau .bashrc, vì vậy nếu bạn đặt một cái gì đó giống như export A=a:$Avào .bashrc, bạn $Asẽ nhận được nhiều hơn trong Bash lồng nhau. Tôi thường để biến môi trường trong hồ sơ và bí danh trong RC.
Franklin Yu

@FranklinYu Có thể không phải là vấn đề lớn với nhiều người, nhưng tôi hoàn toàn đồng ý! Đó là một điểm kỹ thuật tuyệt vời để nhắc nhở mọi người và xứng đáng nhận được nhiều hơn nữa.
Subfuzion

24

Đối với macOS, mã được đưa vào .bash_profileđể hợp nhất mọi thứ thành .bashrcnhư sau:

if [ -f ~/.bashrc ]; then
    source ~/.bashrc
fi

Điều này là cụ thể hơn cho người dùng thiết bị đầu cuối Mac.


6
Trong khi sự thật, điều này khác với câu trả lời của Lurch từ năm 2012 như thế nào?
Arjan

0

TLDR; sử dụng .bash_profilecho bí danh của bạn.

Cách các tệp khởi tạo khác nhau làm việc cùng nhau phức tạp hơn một chút và có một số trường hợp đặc biệt quan trọng trong OSX. Dưới đây là những điểm nổi bật:

  • Bash, trên bất kỳ nền tảng nào, thực thi một trong nhiều tệp khác nhau tùy thuộc vào cách nó được gọi. Các chi tiết ở đây .
  • Ứng dụng đầu cuối của OSX thực hiện một cái gì đó không chuẩn: nó tạo ra mọi tab hoặc cửa sổ mới như thể nó là một vỏ đăng nhập, có nghĩa là nó .bash_profileđược gọi. Do đó, lời khuyên TLDR ở trên.
  • .bashrccũng là một tùy chọn, nhưng nó sẽ được gọi mỗi khi bạn tạo một mạng con (nghĩa là gọi bash), có thể tạo ra sự không hiệu quả nếu bạn cập nhật một biến trong đó (ví dụ PATH=/bin/foo:$PATH:)
  • Các ứng dụng khác có thiết bị đầu cuối nhúng có thể chọn theo quy ước của Ứng dụng đầu cuối hay không. Đáng chú ý, theo mặc định, Visual Studio Code thì không .
  • Các ứng dụng được gọi thông qua GUI không được sinh ra từ trình bao. Do đó, có một số cơ chế cạnh tranh để thiết lập các biến môi trường cho họ thấy, đã thay đổi qua nhiều năm .
  • Đoạn trích cuộc gọi .bashrctừ .bash_profilekhá phổ biến. Tôi không khuyên bạn như vậy, nhưng đó là một sở thích.

Tại sao chính xác là sử dụng .bash_profilecho bí danh phức tạp? Các mục bạn liệt kê chỉ một phần là về bí danh, vì vậy thay vì chỉ liệt kê một số viên đạn có thể giải thích tại sao nó có vẻ phức tạp, bạn có thể đề xuất một cách để làm cho nó dễ dàng hơn trong những ràng buộc này không?
nohillside

Tôi thấy điểm của bạn. Không phải là sử dụng .bash_profile là phức tạp. Đó là cách các tập tin được gọi là phức tạp. Tôi sẽ cập nhật.
Leo

Việc gọi .bashrc từ .bash_profile được khuyến nghị trong hướng dẫn sử dụng bash GNU - nếu không, làm thế nào để bạn đặt các biến, v.v. mà bạn cần cả trong shell đăng nhập và không can thiệp?
Đánh dấu

Mỗi trình giả lập thiết bị đầu cuối mà tôi sử dụng trên các hệ điều hành khác nhau đều có tùy chọn để chạy các cửa sổ mới dưới dạng shell đăng nhập, xterm và Xfce để đặt tên chỉ là hai.
fd0
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.