Я только что установил zsh в своей системе Ubuntu. Похоже, что zsh не выполняет ~/.profile для init. Насколько я понимаю, это должно быть автоматическое поведение. Что мне не хватает?
5 ответов
.profile
против .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, я думаю, это означает, что начиная с lucid), вы можете упростить это, чтобы 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 с действующим sh-режимом zsh. И это только активно во время источника. Таким образом, вам не нужно сохранять текущее состояние параметра, чтобы повторно воспроизвести его после поиска.
У меня .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...