Відповіді:
.profile
vs. .zprofile
Zsh запускається ~/.zprofile
, ні ~/.profile
, коли його викликають як оболонку входу. Причина в тому, що zsh має достатньо несумісності зі стандартними оболонками, щоб зламати скрипти.
Zsh працює, ~/.profile
якщо його називають як sh
або ksh
. Але якщо ваша мета - отримати підказку zsh під час входу, це не допоможе.
Ви можете зробити /bin/sh
свою оболонку для входу та включити export SHELL=/bin/zsh
у свою ~/.profile
. Тоді, коли ви відкриєте термінал, термінал запустить zsh (за винятком кількох емуляторів терміналів, не підкоряються $SHELL
налаштуванню). Але ви все одно будете мати, sh
коли будете входити через ssh. Це можна виправити, включивши exec zsh
в кінці ~/.profile
(це замінює запущену оболонку на zsh), але вам потрібно бути обережним лише для того, щоб це зробити для інтерактивних входів, а не тоді, коли ~/.profile
вони включені в інші сценарії, такі як початок сесії X (добре тест ім'я батьківського процесу , отриманий ps -o comm= $PPID
: якщо це sshd
або su
, то це безпечно exec
).
Найпростіше рішення як для роботи з zsh, так і для запуску ~/.profile
- створити режим, ~/.zprofile
який переходить в режим емуляції sh під час його роботи ~/.profile
:
emulate sh
. ~/.profile
emulate zsh
Якщо у вас є нещодавній zsh (на Ubuntu, це означає, що з моменту ясної), ви можете спростити це до emulate sh -c '. ~/.profile'
.
.zprofile
vs. .zshrc
Файл ~/.profile
завантажується оболонками для входу . Оболонка входу - це перший процес, який починається під час входу в текстовому режимі, наприклад на текстовій консолі або через ssh. За замовчуванням на більшості машин Linux оболонка входу є bash, але ви можете змінити її chsh
командою або через інший інструмент, такий як "Налаштування користувача" в Ubuntu. Коли це оболонка для входу, bash зчитує, ~/.bash_profile
якщо вона існує і ~/.profile
, тоді як zsh читає лише ~/.zprofile
(оскільки її синтаксис не повністю сумісний із традиційним sh). У більшості конфігурацій ~/.profile
також завантажується сценаріями запуску X сеансу під час входу в графічний менеджер дисплеїв.
Коли ви запускаєте емулятор терміналу і отримуєте підказку оболонки, або коли явно запускаєте оболонку, ви отримуєте оболонку, яка не є оболонкою для входу. Оскільки ~/.profile
(або ~/.zprofile
) призначено для команд, які ви хочете виконати під час входу, оболонка, яка не входить у систему, не читає цей файл. Натомість, коли ви запускаєте інтерактивний zsh, він читається ~/.zshrc
. (Zsh читає ~/.zshrc
у всіх інтерактивних оболонках, чи не є оболонками для входу, ні; bash, як не дивно, ніколи не читає ~/.bashrc
в оболонках входу.)
Зазвичай ~/.profile
містить визначення змінних середовищ і може запускати деякі програми, які потрібно запустити один раз, коли ви входите в систему або протягом цілого сеансу; ~/.zshrc
містить речі, які необхідно виконати для кожного екземпляра оболонки, такі як псевдоніми та функції функції, параметри параметрів оболонки, настройки завершення, швидкі налаштування, прив'язки клавіш тощо.
~/.profile
не завантажується zsh
під час входу.zsh
вантажі ~/.zprofile
при вході.zsh
завантажує ~/.zshrc
при запуску нового термінального сеансу.Вам потрібна додаткова інформація? Подивіться на чудову відповідь Жилла!
На додаток до відповіді Гілла, з досить недавньою версією zsh ви можете це зробити:
[[ -e ~/.profile ]] && emulate sh -c 'source ~/.profile'
... Який буде джерелом файлу .profile із ефектом shsh-режиму. І він активний лише під час джерела. Таким чином, вам не потрібно зберігати поточний стан опцій, щоб знову відтворити його після отримання джерела.
Я .zprofile
сумісний .profile
(містить лише зміни PATH), тому потрібні лише:
ln -s .profile .zprofile
ЗШ документація у мене на руках тільки згадує /etc/profile
і ~/.profile
для оболонок входу в ш / КШ режимі сумісності.
% zsh --version
zsh 4.3.10 …
% cat ~/.profile
echo 'Running ~/.profile...'
Оболонка входу в рідний режим (argv [0] починається з -
) не використовує ~/.profile
(хоча буде використовуватись ~/.zprofile
):
% zsh -c 'exec -a -zsh zsh' </dev/null
(немає виходу)
ш / КШ Сумісність режим входу оболонки використовує .profile:
% zsh -c 'exec -a -sh zsh' </dev/null
Running ~/.profile...
% zsh -c 'exec -a -ksh zsh' </dev/null
Running ~/.profile...