Thật không may, không có vị trí di động đầy đủ để đặt các biến môi trường. Hai tệp gần nhất là ~/.profile
vị trí truyền thống và hoạt động tốt trên nhiều thiết lập, và ~/.pam_environment
, một sự thay thế hiện đại, phổ biến nhưng có giới hạn.
Đặt gì vào ~/.pam_environment
Tệp ~/.pam_environment
được đọc bởi tất cả các phương thức đăng nhập sử dụng PAM và đã bật tệp này. Điều này bao gồm hầu hết các hệ thống Linux hiện nay.
Ưu điểm chính của ~/.pam_environment
nó là (khi được bật) nó được đọc trước khi trình bao của người dùng bắt đầu, do đó, nó hoạt động bất kể loại phiên, vỏ đăng nhập và các phức tạp khác. Nó thậm chí hoạt động cho các thông tin đăng nhập không tương tác như su -c somecommand
và ssh somecommand
.
Hạn chế chính ~/.pam_environment
là bạn chỉ có thể đặt các bài tập đơn giản ở đó, không phải cú pháp shell phức tạp. Cú pháp của tập tin này như sau.
- Các tập tin được phân tích cú pháp theo từng dòng.
- Khoảng trắng hàng đầu được bỏ qua.
- Bạn có thể tùy ý bắt đầu các dòng với
export
và một khoảng trắng (không phải là một tab, đi hình).
- Sau đó, mỗi dòng phải có dạng
VAR=VALUE
trong đó VAR bao gồm các chữ cái, chữ số và dấu gạch dưới.
#
bắt đầu một bình luận, nó không thể xuất hiện trong một giá trị.
- Nếu VALUE bắt đầu bằng
'
hoặc "
và chứa một trích dẫn giống hệt nhau, thì VAR được đặt thành chuỗi giữa các trích dẫn (mọi thứ sau khi trích dẫn thứ hai bị bỏ qua). Nếu không, VAR được đặt thành chuỗi sau =
dấu.
- Nếu không có
=
, biến được loại bỏ khỏi môi trường.
Vì vậy, về mặt tích cực, ~/.pam_environment
làm việc trong một loạt các trường hợp. Mặt khác, bạn không thể có bất kỳ cài đặt động nào, chẳng hạn như giá trị của biến trên một biến khác (ví dụ: thêm thư mục vào PATH) hoặc sử dụng đầu ra của lệnh (ví dụ: kiểm tra nếu có thư mục hoặc chương trình) và một số các ký tự ( #'"
, dòng mới) là không thể hoặc rắc rối để đưa vào giá trị.
Đặt gì vào ~/.profile
Tập tin này nên có cú pháp sh xách tay (POSIX). Chỉ sử dụng các phần mở rộng ksh hoặc bash (mảng [[ … ]]
, v.v.) nếu bạn biết rằng hệ thống của bạn có các shell này /bin/sh
.
Tập tin này có thể được đọc bởi các tập lệnh trong các ứng dụng tự động, vì vậy nó không nên gọi các chương trình tạo ra bất kỳ đầu ra hoặc cuộc gọi nào exec
. Nếu bạn muốn làm điều đó trên thông tin đăng nhập ở chế độ văn bản, chỉ làm điều đó cho các vỏ tương tác. Thí dụ:
case $- in *i*)
# Display a message if I have new mail
if mail -e; then echo 'You have new mail'; fi
# If zsh is available, and this looks like a text-mode login, run zsh
case "`ps $PPID` " in
*" login "*)
if type zsh >/dev/null 2>/dev/null; then exec zsh; fi;;
esac
esac
Đây là một ví dụ về việc sử dụng /bin/sh
làm vỏ đăng nhập của bạn và chuyển sang hệ vỏ yêu thích của bạn. Xem thêm cách tôi có thể sử dụng bash làm vỏ đăng nhập của mình khi sysadmin của tôi từ chối để tôi thay đổi
Khi ~/.profile
không đọc được đăng nhập phi đồ họa?
Shell đăng nhập khác nhau đọc các tập tin khác nhau.
Nếu vỏ đăng nhập của bạn là bash
Bash đọc ~/.bash_login
hoặc ~/.bash_profile
nếu chúng tồn tại thay vì ~/.profile
. Ngoài ra bash không đọc ~/.bashrc
trong vỏ đăng nhập ngay cả khi nó tương tác. Để không bao giờ phải nhớ những quirks này một lần nữa, hãy tạo một ~/.bash_profile
với hai dòng sau:
. ~/.profile
case $- in *i*) . ~/.bashrc;; esac
Xem thêm Tập tin thiết lập nào sẽ được sử dụng để thiết lập các biến môi trường với bash?
Nếu vỏ đăng nhập của bạn là zsh
Zsh đọc ~/.zprofile
và ~/.zlogin
, nhưng không ~/.profile
. Zsh có một cú pháp khác với sh, nhưng có thể đọc ~/.profile
ở chế độ mô phỏng sh. Bạn có thể sử dụng điều này cho ~/.zprofile
:
emulate sh -c '. ~/.profile'
Xem thêm Zsh không nhấn ~ / .profile
Nếu shell đăng nhập của bạn là một số shell khác
Bạn không thể làm gì nhiều ở đó, chỉ sử dụng /bin/sh
làm vỏ đăng nhập và vỏ yêu thích của bạn (chẳng hạn như cá) làm vỏ tương tác. Đó là những gì tôi làm với zsh. Xem ở trên để biết ví dụ về việc gọi một shell khác từ ~/.profile
.
Lệnh từ xa
Khi gọi một lệnh từ xa mà không đi qua một vỏ tương tác, không phải tất cả các shell đều đọc một tệp khởi động.
Ksh đọc tệp được chỉ định bởi ENV
biến, nếu bạn quản lý để vượt qua nó.
Bash đọc ~/.bashrc
nếu nó không tương tác (!) Và quá trình cha của nó được gọi là rshd
hoặc sshd
. Vì vậy, bạn có thể bắt đầu ~/.bashrc
với
if [[ $- != *i* ]]; then
. ~/.profile
return
fi
Zsh luôn đọc ~/.zshenv
khi nó bắt đầu. Hãy thận trọng, vì điều này được đọc bởi mọi phiên bản của zsh, ngay cả khi nó là một nhánh con nơi bạn đã đặt các biến khác. Nếu zsh là vỏ đăng nhập của bạn và bạn muốn sử dụng nó để chỉ đặt các biến cho các lệnh từ xa, hãy sử dụng bộ bảo vệ: đặt một số biến trong ~/.profile
, chẳng hạn như MY_ENVIRONMENT_HAS_BEEN_SET=yes
, và kiểm tra bảo vệ này trước khi đọc ~/.profile
.
if [[ -z $MY_ENVIRONMENT_HAS_BEEN_SET ]]; then emulate sh -c '~/.profile'; fi
Các trường hợp đăng nhập đồ họa
Nhiều bản phân phối, trình quản lý hiển thị và môi trường máy tính để bàn sắp xếp để chạy ~/.profile
, bằng cách tìm nguồn cung ứng rõ ràng từ các tập lệnh khởi động hoặc bằng cách chạy shell đăng nhập.
Thật không may, không có phương pháp chung để xử lý các kết hợp distro / DM / DE mà ~/.profile
không đọc được.
Nếu bạn sử dụng một phiên truyền thống bắt đầu bởi ~/.xsession
, đây là nơi bạn nên đặt các biến môi trường của mình; làm điều đó bằng cách tìm nguồn cung ứng ~/.profile
(tức là . ~/.profile
). Lưu ý rằng trong một số thiết lập, tập lệnh khởi động môi trường máy tính để bàn sẽ lấy ~/.profile
lại nguồn .