Відповіді:
.profile vs. .zprofileZsh запускається ~/.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...