Tại sao ~ / .bash_profile không có nguồn gốc khi mở thiết bị đầu cuối?


175

Vấn đề

Tôi có một Máy ảo Ubuntu 11.04 và tôi muốn thiết lập môi trường phát triển Java của mình. Tôi đã làm như sau

  1. sudo apt-get install openjdk-6-jdk
  2. Đã thêm các mục sau vào ~ / .bash_profile

    export JAVA_HOME=/usr/lib/jvm/java-6-openjdk
    
    export PATH=$PATH:$JAVA_HOME/bin
    
  3. Lưu các thay đổi và thoát

  4. Mở một thiết bị đầu cuối một lần nữa và gõ như sau

    echo $JAVA_HOME   (blank)
    echo $PATH        (displayed, but not the JAVA_HOME value)
    
  5. Không có gì xảy ra, giống như việc xuất JAVA_HOME và việc bổ sung PATH không bao giờ được thực hiện.

Giải pháp

Tôi đã phải truy cập ~ / .bashrc và thêm mục nhập sau vào cuối tệp

#Source bash_profile to set JAVA_HOME and add it to the PATH because for some reason is not being picked up
. ~/.bash_profile

Câu hỏi

  1. Tại sao tôi phải làm điều đó? Tôi nghĩ bash_profile, bash_login hoặc hồ sơ mà không có hai cái đó được thực thi đầu tiên trước khi bashrc.
  2. Trong trường hợp này, thiết bị đầu cuối của tôi là một vỏ không đăng nhập ?
  3. Nếu vậy, tại sao khi thực hiện su sau thiết bị đầu cuối và đặt mật khẩu, nó không thực thi hồ sơ mà tôi cũng đã đặt các bản xuất được đề cập ở trên?

Câu trả lời:


224

~/.bash_profilechỉ có nguồn gốc từ bash khi bắt đầu trong chế độ đăng nhập tương tác. Điều đó thường chỉ khi bạn đăng nhập tại bảng điều khiển ( Ctrl+ Alt+ F1.. F6) hoặc kết nối qua ssh.

Khi bạn đăng nhập bằng đồ họa, ~/.profilesẽ có nguồn gốc cụ thể bởi tập lệnh khởi chạy phiên gnome (hoặc bất kỳ môi trường máy tính để bàn nào bạn đang sử dụng). Vì vậy, ~/.bash_profilekhông có nguồn gốc nào khi bạn đăng nhập bằng đồ họa.

Khi bạn mở một thiết bị đầu cuối, thiết bị đầu cuối bắt đầu bash trong chế độ tương tác (không đăng nhập), có nghĩa là nó sẽ nguồn ~/.bashrc.

Vị trí thích hợp để bạn đặt các biến môi trường này ~/.profilevà hiệu ứng sẽ rõ ràng vào lần đăng nhập sau.

Nguồn ~/.bash_profiletừ ~/.bashrcsự là giải pháp sai. Nó được cho là cách khác; ~/.bash_profilenên nguồn ~/.bashrc.

Xem DotFiles để được giải thích kỹ lưỡng hơn, bao gồm một số lịch sử về lý do tại sao nó giống như vậy.

(Một lưu ý phụ, khi cài đặt openjdk qua apt, symlink nên được thiết lập theo gói, để bạn không thực sự cần phải thiết lập JAVA_HOMEhoặc thay đổi PATH)


6
Tôi đã thấy rằng khi mở Terminal từ thanh bên trong Ubuntu 12, tệp ~ / .profile không được tải.
jcollum

3
@jcollum Điều đó tốt. .profilechỉ nên có nguồn gốc khi bạn đăng nhập.
geirha

2
oh, mở một thiết bị đầu cuối không giống như đăng nhập ... Tôi đã nghĩ đăng nhập vào thiết bị đầu cuối .
jcollum

2
Hãy nhớ rằng .profilebị bỏ qua bởi bash nếu .bash_profiletồn tại. Xem câu trả lời của tôi ở đâyman bashđể biết thêm chi tiết.
terdon

3
@terdon, vâng, nhưng bash không liên quan khi đăng nhập bằng đồ họa, vì vậy nó đi thẳng vào .profile.
geirha

48

Bạn có thể kiểm tra xem vỏ Bash của bạn có được khởi động như một vỏ đăng nhập hay không bằng cách chạy:

shopt login_shell

Nếu trả lời là offbạn không chạy shell đăng nhập.

Đọc phần gọi của hướng dẫn Bash về cách Bash đọc (hoặc không đọc) các tệp cấu hình khác nhau.

Trích từ man bash:

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

sumặt khác cũng không khởi động shell đăng nhập theo mặc định, bạn phải bảo nó làm như vậy bằng cách sử dụng --logintùy chọn.


9
Cảm ơn rất nhiều về lệnh login_shell shotp . Tuyệt vời!!
Viriato

27

Tôi nghĩ điều đáng nói là bạn có thể thay đổi mặc định của gnome-terminal để sử dụng shell đăng nhập (ví dụ: bash -l) bằng cách chỉnh sửa tùy chọn hồ sơ.

đi tới Chỉnh sửa -> Tùy chọn hồ sơ -> Tab Tiêu đề và Lệnh kiểm tra tùy chọn "Chạy lệnh dưới dạng vỏ đăng nhập"


1
Nhược điểm để kích hoạt cài đặt này là gì?
chrish

2
@chris bạn chỉ đang tải mã nhiều hơn một chút so với mức cần thiết trong rất nhiều dịp. Nó có thể không quan trọng nếu bạn ~/.bash_profileđang đánh giá thực sự nhanh chóng, đó có thể là trường hợp. Một điều tốt để kiểm tra là để loại bỏ bất kỳ cuộc gọi đến các quy trình khác thường khá tốn kém.
vaab

14

Nếu bạn mở terminal hoặc chạy sushell thì không được thực thi như shell đăng nhập mà là shell tương tác thông thường. Thế là nó đọc ~/.bashrcnhưng không được ~/.bash_profile. Bạn có thể chạy suvới -ltùy chọn để làm cho nó chạy shell của bạn dưới dạng shell đăng nhập.

Khi bạn đang làm việc với GUI, shell thường không bao giờ chạy dưới dạng shell đăng nhập, vì vậy, sẽ rất tốt nếu bạn đặt tất cả nội dung của bạn vào ~/.bashrc.


1
Đó là những gì tôi đã làm và nó đã hoạt động, nhưng kiểm tra xem anh chàng ở phía dưới nói gì, anh ta gợi ý là nên đưa nó vào bashrc và thay vào đó vào hồ sơ. .... Hey cả hai cách làm việc, cảm ơn rất nhiều.
Viriato

4

TL; DR

Trong thiết lập ubfox cổ điển được đề xuất, chỉ ~/.bash_profileđược đánh giá trong những dịp cụ thể. Và nó có ý nghĩa.

Đặt công cụ của bạn vào ~/.bashrc, nó sẽ được đánh giá mọi lúc.

Ok, tôi muốn hiểu, tại sao điều này có ý nghĩa?

Các điểm chính để hiểu những gì đang xảy ra:

  • tất cả các quy trình trên linux có và sử dụng các biến môi trường
  • biến môi trường được kế thừa
  • do đó, đặt chúng một lần vào cha của tất cả quá trình của bạn là đủ (đặc biệt nếu nó yêu cầu một số thời gian tính toán.)
  • cha đẻ của tất cả quá trình của bạn thường được khởi chạy sau khi bạn đăng nhập trên thiết bị của mình (cung cấp thông tin đăng nhập của bạn).
  • có những điều bạn có thể muốn làm chỉ một lần khi bạn đăng nhập trên máy tính của mình (ví dụ: kiểm tra thư mới ...).

Vì vậy, thời gian "đăng nhập" thường là:

  • Trong chế độ bảng điều khiển, khi bạn đăng nhập (bằng Ctrl-Alt F1) hoặc thông qua ssh, vì trình bao sẽ là cha đẻ của tất cả quá trình, nó sẽ tải bạn ~/.bash_profile.
  • Trong chế độ đồ họa, khi bạn mở phiên của mình, quy trình đầu tiên ( gnome-sessionđối với Ubuntu cổ điển) sẽ có trách nhiệm đọc
    .profile.

Ok, vậy để đặt công cụ của tôi ở đâu?

Nó khá phức tạp, toàn bộ câu chuyện ở đây . Nhưng đây là một sự cố khá phổ biến đối với người dùng Ubuntu. Vì vậy, xem xét rằng:

  • bạn dùng bashvỏ,
  • bạn có một ~/.bash_profilevà làm theo khuyến nghị để thêm tải ~/.bashrctrong ~/.bash_profileđể có được ít nhất một tệp được đánh giá bất cứ điều gì là mecanism gọi .

Đây là một gợi ý nhanh chóng về nơi để đặt mọi thứ.

  • ~ / .bashrc (Được đánh giá trong tất cả các trường hợp , miễn là bạn làm theo khuyến nghị)

    Cho nhanh đánh giá biến môi trường và mã cho bạn sử dụng chỉbash chỉ sử dụng dòng lệnh (bí danh ví dụ). bashism được chào đón.

    Nó được tải trên chính nó:

    • tạo một cửa sổ / khung vỏ mới trong các phiên đồ họa.
    • gọi bash
    • screenkhung hoặc tab mới. (không phải tmux!)
    • bất kỳ trường hợp bash nào trong máy khách bảng điều khiển đồ họa ( terminator/ gnome-terminal...) nếu bạn không chọn tùy chọn "chạy lệnh như vỏ đăng nhập".

    Và nó sẽ được tải trong tất cả các dịp khác nhờ vào khuyến nghị trước.

  • ~ / .bash_profile (Chỉ được đánh giá trong một dịp cụ thể )

    Đối với biến và mã môi trường đánh giá chậm cho các quy trình chỉ dành cho người dùngphiên giao diện điều khiển . bashism được chào đón. Nó được tải vào:

    • đăng nhập bảng điều khiển (Ctrl-Alt F1),
    • ssh đăng nhập vào máy này,
    • tmuxcửa sổ hoặc cửa sổ mới (cài đặt mặc định), (không screen!)
    • cuộc gọi rõ ràng của bash -l,
    • bất kỳ trường hợp bash nào trong máy khách bảng điều khiển đồ họa ( terminator/ gnome-terminal...) chỉ khi bạn đánh dấu tùy chọn "chạy lệnh như vỏ đăng nhập".
  • ~ / .profile (Chỉ được đánh giá trong phiên đồ họa)

    Đối với các biến môi trường đánh giá chậmkhông có lỗi đối với chỉ các người dùng và tất cả các quy trình phiên đồ họa . Nó được tải khi đăng nhập vào giao diện người dùng đồ họa của bạn.


Trong các trường hợp bash không tải tệp hồ sơ, nó sẽ tải .profilenếu .bash_profilekhông tồn tại.
muru

Cảm ơn bạn rất nhiều vì đã giải thích rõ ràng. nó giúp những người mới như tôi Trong Mac Mojave, nếu tôi đặt các biến vào ~ / .bashrc và làm nguồn, sau đó nếu tôi envkhông thấy các biến env được đặt (tôi đã thử đóng iTerm và mở lại). Nhưng tôi nhận thấy rằng khi tôi cài đặt Android studio và các ứng dụng khác, tất cả các vv env đó đã được đặt /.bash_profile. Vì vậy, khi tôi thêm vào /.bash_profilenó làm việc như quyến rũ. Tại sao vậy?
sofs1
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.