Biến môi trường trong bash_profile hoặc bashrc?


36

Tôi đã tìm thấy câu hỏi này [blog]: Sự khác biệt giữa .bashrc và .bash_profile rất hữu ích nhưng sau khi thấy câu trả lời được bình chọn nhiều nhất (rất tốt) tôi có thêm câu hỏi. Đến cuối câu trả lời được bình chọn nhiều nhất, câu trả lời đúng tôi thấy tuyên bố như sau:

Lưu ý rằng bạn có thể thấy ở đây và có các khuyến nghị để đặt định nghĩa biến môi trường trong ~ / .bashrc hoặc luôn khởi chạy shell đăng nhập trong thiết bị đầu cuối. Cả hai đều là những ý tưởng tồi.

  1. Tại sao nó là một ý tưởng tồi (tôi không cố gắng chiến đấu, tôi chỉ muốn hiểu)?

  2. Nếu tôi muốn đặt biến môi trường và thêm nó vào PATH (ví dụ JAVA_HOME), nơi đó sẽ là nơi tốt nhất để đặt mục xuất? trong ~ / .bash_profile hoặc ~ / .bashrc ?

  3. Nếu câu trả lời cho câu hỏi số 2 là ~ / .bash_profile , thì tôi có thêm hai câu hỏi:

    3.1. Bạn sẽ đặt gì dưới ~ / .bashrc ? chỉ bí danh?

    3.2. Trong một vỏ không đăng nhập, tôi tin rằng ~ / .bash_profile không bị "nhặt". Nếu việc xuất mục JAVA_HOME là trong bash_profile, tôi có thể thực thi các lệnh javac & java không? Nó sẽ tìm thấy chúng trên PATH? Đó có phải là lý do tại sao một số bài đăng và diễn đàn đề nghị đặt JAVA_HOME và giống với ~ / .bashrc không?

    Cảm ơn trước.

Câu trả lời:


26

Trên một hệ thống hiện đại, nó không phải là đặc biệt phổ biến để chạy vào các trường hợp quan trọng, nhưng nó xảy ra. (Đặc biệt, nếu bạn sử dụng các thao tác shell vimdưới dạng :r !commandhoặc trong !<motion>commandbiểu mẫu nội tuyến .)

Bạn sẽ đặt gì dưới ~ / .bashrc? chỉ bí danh?

Bạn đặt những thứ trong ~/.bashrcđó sẽ không được kế thừa bởi các lớp con tự động; điều này có nghĩa là bí danh và chức năng, chủ yếu, mặc dù đôi khi bạn có các cài đặt biến mà bạn không muốn nhìn thấy bên ngoài vỏ (điều này rất hiếm). Có thể lập luận rằng những thứ đó nên được xuất khẩu bằng cách nào đó, nhưng những nỗ lực thử nghiệm khác nhau đã gặp phải vấn đề tương thích với việc cố gắng che giấu chúng trong môi trường và hầu hết đã bị bỏ rơi.

Nếu tôi muốn đặt biến môi trường và thêm nó vào PATH (ví dụ JAVA_HOME), nơi đó sẽ là nơi tốt nhất để đặt mục xuất? trong ~ / .bash_profile hoặc ~ / .bashrc?

Bạn đặt các cài đặt môi trường ~/.bash_profileđể chúng được cung cấp các cài đặt ban đầu lành mạnh. Đôi khi bạn sẽ muốn ghi đè lên chúng (thường điều này được thực hiện bởi các môi trường phức tạp như Matlab hoặc Cadence); nếu bạn đặt các cài đặt môi trường ~/.bashrcthì các shell chạy từ trong các môi trường đó sẽ mất các tùy chỉnh của môi trường và kết quả là mọi thứ có thể không hoạt động chính xác. Điều này cũng áp dụng nếu bạn sử dụng một gói như mô-đun , virtualenv , rvm , v.v. để quản lý nhiều môi trường phát triển; đặt cài đặt của bạn vào ~/.bashrcnghĩa là bạn không thể chạy môi trường bạn muốn trong trình chỉnh sửa của mình, nhưng thay vào đó sẽ bị buộc vào mặc định hệ thống.

Trong một vỏ không đăng nhập, tôi tin rằng ~ / .bash_profile không bị "nhặt".

Chính xác; bạn thường muốn shell ban đầu là shell đăng nhập và bất kỳ shell nào bắt đầu dưới shell đó không phải là shell đăng nhập. Nếu shell ban đầu không phải là shell đăng nhập, bạn sẽ không có mặc định PATHhoặc nhiều cài đặt khác (bao gồm cả JAVA_HOMEví dụ của bạn ).

Hầu hết các môi trường máy tính để bàn được khởi chạy từ trình quản lý hiển thị (có nghĩa là, phần lớn các thông tin đăng nhập đồ họa) không thiết lập môi trường đăng nhập cho toàn bộ máy tính để bàn, do đó bạn buộc phải chạy shell ban đầu trong các thiết bị đầu cuối dưới dạng vỏ đăng nhập. Điều này gây ra một số vấn đề (đáng chú ý là PATHvà các chương trình có sẵn cho các chương trình chạy từ bảng điều khiển không được thiết lập đúng, vì bảng điều khiển không phải là thiết bị đầu cuối và không chạy ~/.bash_profile), nhưng là một thỏa hiệp hợp lý cho rằng không phải lúc nào cũng có thể để hoàn toàn chạy ~/.bash_profiletrong môi trường không tương tác vào đầu phiên bắt đầu bởi người quản lý hiển thị, tùy thuộc vào nội dung của nó. Đôi khi nó được đề xuất để đặt các thiết lập môi trường trong~/.bashrcthay vì cấu hình shell đăng nhập thay thế; như đã trình bày ở trên, các công trình này miễn là bạn không cần phải ghi đè môi trường đó, và gây vỡ lẻ một khi bạn làm cần thiết phải làm như vậy.

Gần đây tôi đã giúp chẩn đoán một vấn đề như thế này trên OS X, nơi người dùng đã đặt cài đặt ~/.bashrcsau đó bắt đầu sử dụng rvmperlbrew thấy hành vi kỳ quặc, bởi vì các môi trường được thiết lập bởi hai người đã "hoàn tác" bởi ~/.bashrccác biên tập viên bên trong và sudo(trên OS X , không giống như Linux, tuyên truyền cho người dùng $HOMEđể họ ~/.bashrcđược chạy bởi trình bao gốc). Trước khi thử sử dụng các môi trường đó, không có vấn đề gì; khi bắt đầu sử dụng chúng, họ hoang mang vì mất cài đặt bất ngờ.


1
Tôi nghĩ rằng tôi hiểu, tôi có thể phải đọc nó nhiều lần hơn để nội tâm hóa nó nhiều hơn nhưng tôi đang kết luận như sau. Trong môi trường doanh nghiệp để có quyền kiểm soát tốt hơn các shell tùy chỉnh mà không có tác dụng phụ của toàn cầu, cách tốt nhất là đặt các biến môi trường trong ~ / .bash_profile . Trong môi trường cá nhân như Ubuntu hoặc Linux Mint để cài đặt đúng PATH, tôi nên đặt nó dưới ~ / .bashrc (hoặc thậm chí trong / etc / profile ). Tôi có đúng không?
Viriato

Nó ít liên quan đến môi trường doanh nghiệp hơn là dù bạn chỉ là người dùng hay nhà phát triển; các hệ thống thích modulesrvmlà công cụ dành cho nhà phát triển, cũng như Matlab và Cadence cho các định nghĩa hơi khác nhau về "nhà phát triển". Phát triển đơn giản cũng không đòi hỏi họ, nhưng khi bạn cần phải kiểm tra đối với nhiều phiên bản của Ruby, Perl, Python hoặc sau đó bạn thực sự muốn một cái gì đó giống như rvm, perlbrewvirtualenv(tương ứng) xung quanh để giúp giữ cho nó tất cả thẳng.
geekizard

2

thành thật mà nói, có rất ít sự khác biệt những ngày này bất chấp những gì đạo sư đã nói.

Vấn đề đằng sau điều này là ngày nay chúng ta đăng nhập bằng đồ họa chứ không phải thông qua vỏ đăng nhập. Trước đây, chúng tôi hủy kết hợp người dùng muốn xem một báo cáo ngắn về những gì đang xảy ra trên máy chủ ngay sau khi đăng nhập - sau đó chúng tôi sẽ bắt đầu X bằng dòng lệnh - những báo cáo này thường cần một thời gian để tạo (ví dụ 10-20 giây). và sau đó chúng ta không muốn thấy điều tương tự khi chúng ta bắt đầu, ví dụ xterm. do đó, sự khác biệt.

ngày nay tôi không nghĩ rằng sự khác biệt là quan trọng bây giờ. Tôi nghĩ những ngày này nếu bạn nguồn bashrc trong bash_profile không ai có thể đổ lỗi cho bạn.

lưu ý rằng điều này không áp dụng cho macos x (mỗi terminal.app bắt đầu là một vỏ đăng nhập)


Tôi không chắc chắn chính xác tôi hoàn toàn hiểu, nhưng tại nơi làm việc khi tôi đăng nhập thông qua ssh đó là shell đăng nhập, sau đó bash_profile và bashrc có nguồn gốc nên tôi đoán trong trường hợp đó không thành vấn đề. Nhưng nếu tôi đăng nhập bằng đồ họa (điều đó có nghĩa là gì)? như đăng nhập vào Ubuntu cá nhân của tôi?
Viriato

Đồng ý với câu trả lời @bubu tại đây - bất kỳ thiết lập ~/.bash_profilenào không có nguồn ~/.bashrckhá khó để làm việc và verging bị hỏng. Các ứng dụng thiết bị đầu cuối đồ họa có nghĩa là đơn giản hơn chỉ cần nguồn ~ / .bashrc và đặt tất cả cấu hình vào đó.
RichVel

1

Chà, về "Đăng nhập đồ họa", nó phụ thuộc vào * DM bạn sử dụng ...

Với GDM (Gnome 3.18) tôi có điều này:

/ etc / gdm / Xsession

#!/bin/sh   <= *important*

...

# First read /etc/profile and .profile
test -f /etc/profile && . /etc/profile
test -f "$HOME/.profile" && . "$HOME/.profile"
# Second read /etc/xprofile and .xprofile for X specific setup
test -f /etc/xprofile && . /etc/xprofile
test -f "$HOME/.xprofile" && . "$HOME/.xprofile"

Vì vậy, ~ / .profile có nguồn gốc khi đăng nhập bằng cách sử dụng / bin / sh chứ không phải / bin / bash

Có hai trường hợp

  1. / bin / sh được liên kết với / bin / bash nhưng chạy ở chế độ "POSIX / Bourne"
  2. / bin / sh/ bin / dash (debian / ubfox). Nhanh nhất nhưng có ít tính năng hơn (hỗ trợ ShellShock;) )

Vì vậy, cấu hình / bin / sh là ~ / .profile chứ không phải ~ / .bash_profile, ~ / .zprofile

Tập tin này nên được sử dụng cho các cài đặt "vỏ bất khả tri" , như các biến đường dẫn và môi trường.

KHÔNG nên có chương trình thực thi cho tương tác người dùng chỉ đăng nhập nhưng ở đây (kiểm tra thư, vận may, v.v ...)

RC ~ /.* chỉ dành cho các phiên "tương tác" (ví dụ bí danh ...)

Có một sự khác biệt giữa bash và zsh cho shell đăng nhập tương tác

các nguồn bash chỉ .bash_profile, trong khi các nguồn zsh theo thứ tự:

  1. ~ / .zprofile
  2. ~ / .zshrc
  3. ~ / zlogin (ở đây có các bí danh được xác định trong ~ / .zshrc. Trong trường hợp shell "tương tác" + "đăng nhập"

Cách làm đúng ~ / .bash_profile đã được trả lời ở đây:

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

if [ -r ~/.profile ]; then . ~/.profile; fi
case "$-" in *i*) if [ -r ~/.bashrc ]; then . ~/.bashrc; fi;; esac

Để kích hoạt kiểm tra (và định hình), bạn có thể sử dụng

~ / .bash_profile:

#!/bin/bash

# ------------------------------------------------
export _DOT_BASH_PROFILE_0=`date  --rfc-3339=ns`
# ------------------------------------------------

if [ -f ~/.profile ] ; then
    . ~/.profile
fi

case "$-" in *i*) if [ -r ~/.bashrc ]; then . ~/.bashrc; fi;; esac

# ------------------------------------------------
export _DOT_BASH_PROFILE_1=`date  --rfc-3339=ns`
# ------------------------------------------------

~ / .zprofile:

#!/bin/zsh

# ------------------------------------------------
export _DOT_ZSH_PROFILE_0=`date  --rfc-3339=ns`
# ------------------------------------------------

if [ -f ~/.profile ] ; then
    . ~/.profile
fi

# no need to source, zsh already handle ~/.zshrc

###case "$-" in *i*) if [ -r ~/.zshrc ]; then . ~/.zshrc; fi;; esac

# ------------------------------------------------
export _DOT_ZSH_PROFILE_1=`date  --rfc-3339=ns`
# ------------------------------------------------

sau đó, để kiểm tra:

chsh -s /bin/bash

ssh localhost
env

exit

ssh localhost env

ssh -t localhost bash -i -c env


chsh -s /bin/zsh

ssh localhost
env

exit

ssh localhost env

ssh -t localhost bash -i -c env

Vì vậy, RVM / virtualenv nên vào ~ / .profile, IMHO

Nhưng điều này KHÔNG LÀM VIỆC , đôi khi ...

Chẳng hạn, virualenvwrapper chỉ hoạt động nếu shell chạy Xsession là một bash "gốc" (xuất BASH_VERSION)

Nếu bạn đang sử dụng hệ thống gạch ngang , biến môi trường và cài đặt đường dẫn hoạt động, nhưng định nghĩa hàm virualenvwrapper không hoạt động vì tập lệnh không tuân thủ POSIX.

Kịch bản không đưa ra bất kỳ lỗi nào nhưng nó kết thúc mà không có bất kỳ định nghĩa "workon" nào .

Vì vậy, bạn có thể thiết lập môi trường trong tay ~ / .profile , chỉ để cho phép thực thi python chính xác từ máy khách bắt đầu trực tiếp từ X:

export VIRTUAL_ENV="/home/mike/var/virtualenvs/myvirtualenv"
export PATH="$VIRTUAL_ENV/bin:$PATH"
unset PYTHON_HOME

https://gist.github.com/datagrok/2199506

https://www.bountysource.com/issues/9061991-sding-up-your-computer-virtualenvwrapper-linux-all

Nhưng đối với virualenvwrapper bạn có hai lựa chọn thay thế:

  1. nguồn nó trong ~ / .bash_profile hoặc ~ / .zprofile (hoặc ~ / .zlogin) khi thiết bị đầu cuối hoạt động như vỏ đăng nhập
  2. bao gồm tập lệnh trong ~ / .bashrc hoặc ~ / zshrc

Điều này có nghĩa là các máy khách X (ví dụ emacs) nên được khởi động từ vỏ thiết bị đầu cuối chứ không phải từ đồ họa!

"Tôi không thể có được sự hài lòng ..."


Một câu chuyện hoàn toàn khác đang chạy các dịch vụ với systemd Một số lựa chọn thay thế có thể là: viết tập lệnh bao bọc , xác định môi trường trong tệp định nghĩa "dịch vụ" , bỏ môi trường trong tệp "env" để lấy nguồn gốc trong vỏ cha. Mọi thứ trở nên phức tạp hơn với RVM / virtualenv ...
hute37
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.