Biến môi trường trong bash_profile hoặc bashrc?
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 (nhân tiện, tôi có thêm câu hỏi. Đến cuối câu trả lời đúng, được bình chọn nhiều nhất, tôi thấy câu trả lời như sau:
Lưu ý rằng bạn có thể thấy ở đây và có các khuyến nghị để đặt các định nghĩa biến môi trường trong ~ / .bashrc hoặc luôn khởi chạy trình bao đăng nhập trong các thiết bị đầu cuối. Cả hai đều là những ý tưởng tồi.
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)?
Nếu tôi muốn đặt mộ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 ?
Nếu câu trả lời cho câu hỏi số 2 là ~ / .bash_profile , thì tôi có hai câu hỏi khác:
3.1. Bạn sẽ đặt gì dưới ~ / .bashrc ? chỉ bí danh?
3.2. Trong một trình bao không đăng nhập, tôi tin rằng ~ / .bash_profile không được "chọn". Nếu xuất mục nhập JAVA_HOME trong bash_profile, tôi có thể thực hiện các lệnh javac & java không? Nó có tìm thấy chúng trên PATH không? Đó có phải là lý do tại sao một số bài đăng và diễn đàn đề xuất đặt JAVA_HOME và tương tự thành ~ / .bashrc ?
Cảm ơn trước.
Trả lời
Trên một hệ thống hiện đại, việc gặp phải những trường hợp quan trọng không phải là điều đặc biệt, nhưng nó vẫn xảy ra. (Đặc biệt, nếu bạn sử dụng các phép toán shell ở dạng vimchẳng hạn :r !commandhoặc trong dòng !<motion>command.)
Bạn sẽ đặt gì dưới ~ / .bashrc? chỉ bí danh?
Bạn đặt những thứ vào ~/.bashrcđó sẽ không được kế thừa bởi các dấu kiểm con tự động; điều này có nghĩa là hầu hết các bí danh và chức năng, mặc dù đôi khi bạn có các cài đặt thay đổi mà bạn không muốn hiển thị bên ngoài shell (điều này rất hiếm). Có thể lập luận rằng những thứ đó nên được xuất bằng cách nào đó, nhưng nhiều 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 ẩn chúng trong môi trường và hầu hết đã bị bỏ rơi.
Nếu tôi muốn đặt mộ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 đưa các cài đặt môi trường vào ~/.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 đè những điều này (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 đưa cài đặt môi trường vào ~/.bashrcthì shell chạy từ bên trong các môi trường đó sẽ làm 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 bình thường. Đ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; đưa cài đặt của bạn vào ~/.bashrccó nghĩa là bạn không thể chạy môi trường bạn muốn từ bên trong trình chỉnh sửa của mình, mà thay vào đó, nó sẽ bị buộc vào mặc định của hệ thống.
Trong một trình bao không đăng nhập, tôi tin rằng ~ / .bash_profile không được "chọn".
Chính xác; bạn thường muốn trình bao ban đầu là trình bao đăng nhập và bất kỳ trình bao nào bắt đầu dưới trình bao đó không phải là trình bao đăng nhập. Nếu trình bao ban đầu không phải là trình bao đăng nhập, bạn sẽ không có PATHcài đặt mặc định hoặ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 đă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, vì vậy bạn buộc phải chạy trình bao ban đầu trong các thiết bị đầu cuối dưới dạng trình bao đăng nhập. Điều này gây ra một số vấn đề (đáng chú ý là các PATHchương trình có sẵn và tương tự như vậy có sẵn cho các chương trình chạy từ các bảng điều khiển, ví dụ như bảng điều khiển không được thiết lập đúng cách, vì bảng điều khiển không phải là thiết bị đầu cuối và chưa chạy ~/.bash_profile), nhưng là một thỏa hiệp hợp lý vì nó không phải lúc nào cũng có thể để chạy ~/.bash_profilemột cách lành mạnh trong môi trường không tương tác vào đầu phiên do trình quản lý hiển thị bắt đầu, tùy thuộc vào nội dung của nó. Đôi khi người ta đề xuất đặt cài đặt môi trường ~/.bashrcthay vì định cấu hình trình bao đăng nhập; 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 sự cố như thế này trên OS X trong đó một người dùng đã đặt cài đặt ~/.bashrcsau đó bắt đầu sử dụng rvmvà viết tiếng Anh đã thấy hành vi kỳ lạ, bởi vì môi trường do cả hai thiết lập đã bị "hoàn tác" bởi ~/.bashrccác trình chỉnh sửa bên trong và sudo(trên OS X , không giống như Linux, truyền bá 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ì xảy ra; khi bắt đầu sử dụng chúng, họ rất hoang mang vì mất cài đặt bất ngờ.
thành thật mà nói, những ngày này có rất ít sự khác biệt bất chấp những gì vị đạ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 thay vì thông qua trình bao đăng nhập. trước đây, người dùng unix chúng tôi muốn xem một báo cáo ngắn về những gì đang diễn 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 yêu cầu một khoảng thời gian để tạo (ví dụ: 10-20 giây). và sau đó chúng tôi không muốn thấy giống nhau khi chúng tôi 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à bất kỳ quan trọng bây giờ. Tôi nghĩ những ngày này nếu bạn mã nguồn bashrc trong bash_profile thì 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 trình bao đăng nhập)
Về "Thông tin đăng nhập bằng đồ họa", nó phụ thuộc vào * DM bạn sử dụng ...
Với GDM (Gnome 3.18), tôi có cái 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 lấy nguồn khi đăng nhập bằng / bin / sh chứ không phải / bin / bash
Có hai trường hợp
- / bin / sh được liên kết với / bin / bash nhưng chạy ở chế độ "POSIX / Bourne"
- / bin / sh là / bin / dash (debian / ubuntu). Nhanh nhất nhưng ít tính năng hơn (Hỗ trợ ShellShock;) )
Vì vậy, hồ sơ / bin / sh là ~ / .profile chứ không phải ~ / .bash_profile, ~ / .zprofile
Tệp này phải được sử dụng cho các cài đặt "shell bất khả tri" , chẳng hạn như 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ư, tài sản, v.v.)
~ /.* rc chỉ dành cho các phiên "tương tác" (ví dụ: bí danh ...)
Có sự khác biệt giữa bash và zsh đối với shell đăng nhập tương tác
chỉ nguồn bash .bash_profile, trong khi nguồn zsh theo thứ tự:
- ~ / .zprofile
- ~ / .zshrc
- ~ / zlogin (ở đây các bí danh được định nghĩa trong ~ / .zshrc có sẵn. trong trường hợp shell "tương tác" + "đăng nhập"
Cách đúng để làm ~ / .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
Để bật kiểm tra (và lập hồ sơ), 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 đi vào ~ / .profile, IMHO
Nhưng điều này KHÔNG HOẠT ĐỘNG , đôi khi ...
Ví dụ: virualenvwrapper chỉ hoạt động nếu shell chạy Xsession là bash "gốc" (xuất BASH_VERSION)
Nếu bạn đang sử dụng hệ thống dấu gạch ngang , biến môi trường và thiết lập đườ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.
Tập lệnh 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 ~ / .profile , chỉ để kích hoạt thực thi python chính xác từ ứng dụng khách được 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-setting-up-your-computer-virtualenvwrapper-linux-all
Nhưng đối với virualenvwrapper, bạn có hai lựa chọn thay thế:
- mã nguồn nó trong ~ / .bash_profile hoặc ~ / .zprofile (hoặc ~ / .zlogin) khi thiết bị đầu cuối hoạt động như trình bao đăng nhập
- 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ụ: emac) phải được bắt đầu từ terminal shell chứ không phải từ đồ họa!
"Tôi không thể không hài lòng ..."