На жаль, не існує повністю портативного місця для встановлення змінних середовища. Два файли, які найближче наближаються ~/.profile
, це традиційне місце розташування і працює нестандартно для багатьох установок, а ~/.pam_environment
також сучасна, звичайна, але обмежена альтернатива.
Що вкласти ~/.pam_environment
Файл ~/.pam_environment
читається всіма методами входу, які використовують PAM та ввімкнено цей файл. Сьогодні це стосується більшості систем Linux.
Основною перевагою ~/.pam_environment
є те, що (при включенні) воно зчитується до запуску оболонки користувача, тому воно працює незалежно від типу сеансу, оболонки входу та інших складностей. Він навіть працює для неінтерактивних входів, таких як su -c somecommand
і ssh somecommand
.
Основне обмеження ~/.pam_environment
полягає в тому, що ви можете розміщувати там просто прості завдання, а не складний синтаксис оболонки. Синтаксис цього файлу такий.
- Файли аналізуються по рядках.
- Провідна пробіл ігнорується.
- Ви можете необов'язково починати рядки з
export
та пробілу (не вкладка, перехідна фігура).
- Після цього кожен рядок повинен мати форму,
VAR=VALUE
де VAR складається з літер, цифр та підкреслень.
#
починає коментар, він не може відображатися у значенні.
- Якщо VALUE починається з
'
або "
містить іншу ідентичну цитату, то VAR встановлюється на рядок між цитатами (все після другої лапки ігнорується). В іншому випадку VAR встановлюється на рядок після =
знаку.
- Якщо немає
=
, змінна видаляється з оточення.
Тож, перевернувшись, ~/.pam_environment
працює у великій кількості обставин. З іншого боку, ви не можете мати жодних динамічних налаштувань, таких як базувати значення змінної на іншій змінній (наприклад, додавання каталогу в PATH) або використовувати висновок команди (наприклад, перевірити наявність каталогу чи програми) та деякі символів ( #'"
, новий рядок) неможливо або клопітно ввести значення.
Що вкласти ~/.profile
Цей файл повинен мати синтаксис портативного (POSIX) sh. Використовуйте розширення ksh або bash (масиви [[ … ]]
тощо), лише якщо ви знаєте, що ваша система має такі оболонки як /bin/sh
.
Цей файл може читатися сценаріями в автоматизованих програмах, тому він не повинен викликати програми, які виробляють який-небудь вихід або виклик exec
. Якщо ви хочете зробити це для входу в текстовий режим, робіть це лише для інтерактивних оболонок. Приклад:
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
Це приклад використання /bin/sh
в якості оболонки для входу та переходу до улюбленої оболонки. Дивіться також, як я можу використовувати bash як оболонку входу, коли мій sysadmin відмовляється дозволити мені змінити його
Коли ~/.profile
не читається неграфічний логін?
Різні оболонки для входу читають різні файли.
Якщо ваша оболонка для входу є невдалою
Bash читає ~/.bash_login
або ~/.bash_profile
якщо вони існують замість ~/.profile
. Також bash не читає ~/.bashrc
в оболонці входу, навіть якщо він інтерактивний. Щоб більше ніколи не запам'ятовувати ці примхи, створіть ~/.bash_profile
наступні два рядки:
. ~/.profile
case $- in *i*) . ~/.bashrc;; esac
Дивіться також Які файли налаштування слід використовувати для налаштування змінних середовища з bash?
Якщо оболонка для входу - zsh
Зш читає ~/.zprofile
і ~/.zlogin
, але ні ~/.profile
. Zsh має інший синтаксис від sh, але може читати ~/.profile
в режимі емуляції sh. Ви можете використовувати це для своїх ~/.zprofile
:
emulate sh -c '. ~/.profile'
Дивіться також Zsh не потрапляє ~ / .profile
Якщо ваша оболонка для входу - це якась інша оболонка
Зробити там не так багато, окрім використання /bin/sh
в якості оболонки для входу, а улюблена оболонка (наприклад, риба) лише як інтерактивна оболонка. Ось що я роблю з zsh. Дивіться вище для прикладу виклику іншої оболонки з ~/.profile
.
Віддалені команди
Якщо викликати віддалену команду, не проходячи інтерактивну оболонку, не всі оболонки читають файл запуску.
Ksh зчитує файл, вказаний ENV
змінною, якщо вам вдасться передати його.
Bash зчитує, ~/.bashrc
якщо він не інтерактивний (!) І його батьківський процес називається rshd
або sshd
. Таким чином , ви можете почати ~/.bashrc
з
if [[ $- != *i* ]]; then
. ~/.profile
return
fi
Zsh завжди читає, ~/.zshenv
коли воно починається. Використовуйте обережно, оскільки це читається кожним екземпляром zsh, навіть коли це піддіаграма, де ви встановили інші змінні. Якщо zsh - ваша оболонка для входу, і ви хочете використовувати її для встановлення змінних лише для віддалених команд, використовуйте захист: встановіть деяку змінну в ~/.profile
, наприклад MY_ENVIRONMENT_HAS_BEEN_SET=yes
, і перевірте цей захист перед читанням ~/.profile
.
if [[ -z $MY_ENVIRONMENT_HAS_BEEN_SET ]]; then emulate sh -c '~/.profile'; fi
Справа графічних логінів
Багато дистрибутивів, диспетчери дисплеїв та настільних комп’ютерів організовують запуск ~/.profile
або шляхом явного джерела сценаріїв запуску, або за допомогою оболонки входу.
На жаль, не існує загального методу обробки комбінацій distro / DM / DE, де ~/.profile
не читається.
Якщо ви використовуєте традиційний сеанс, розпочатий ним ~/.xsession
, це місце, де ви повинні встановити змінні середовища; зробіть це за допомогою джерела ~/.profile
(тобто . ~/.profile
). Зауважте, що в деяких налаштуваннях сценарії запуску робочого середовища ~/.profile
знову будуть джерелами .