Зш не попал ~ / .профиль

145

Я только что установил zsh в своей системе Ubuntu. Кажется, что zsh не выполняет ~ / .profile в init. Насколько я понимаю, это должно быть автоматическое поведение. Что мне не хватает?

shmichael
источник

Ответы:

204

.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-сессии (хороший test - это имя родительского процесса, полученное с помощью 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 против .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содержит действия, которые необходимо выполнить для каждого экземпляра оболочки, такие как определения псевдонимов и функций, настройки параметров оболочки, настройки завершения, настройки подсказок, привязки клавиш и т. д.

жилль
источник
Отличный ответ! Я создал ~ / .zprofile и поставил строку, как вы предложили, но она, похоже, ничего не делает. Может быть, я должен положить его в .zshrc?
shmichael
1
@shmichael: Учитывая вашу реакцию, я, возможно, не истолковал ваш вопрос так, как вы хотели. Поможет ли второй раздел, который я добавил в ответ?
Жиль
да, попал в точку Поэтому, если я правильно понимаю, я бы хотел, например, объявления PATH для .zprofile и псевдонимы для .zshrc.
shmichael
@ user1419674 Спасибо за исправление, но не добавляйте журнал изменений в сообщения. На сайте есть встроенная история изменений.
Жиль
69

Краткий ответ для нетерпеливых людей:

  1. ~/.profileне загружается zshпри входе в систему.
  2. zshзагружается ~/.zprofileпри входе в систему.
  3. zshзагружается ~/.zshrcпри запуске нового терминального сеанса.

Нужна дополнительная информация? Посмотрите на превосходный ответ Жиля!

Карл Моррисон
источник
Отличный ответ. Как раз то, что вам нужно.
Джанго Рейнхардт
21

В дополнение к ответу Жиля, с относительно свежей версией zsh вы можете сделать это:

[[ -e ~/.profile ]] && emulate sh -c 'source ~/.profile'

... Который будет источником файла .profile с действующим sh-режимом zsh. И это только активно во время источника. Таким образом, вам не нужно сохранять текущее состояние параметра, чтобы повторно воспроизвести его после поиска.

Фрэнк Тербек
источник
У меня есть это в моем ~ / .zprofile, но по какой-то причине утверждения в ~ / .profile не доступны в моей оболочке. Ubuntu 15.04; zsh 5.0.7
Friederbluemle
Трудно диагностировать без кода.
Фрэнк Тербек,
Я просто попробовал еще раз, и похоже, что сейчас работает. Не уверен, что это было исправлено в какой-то момент или что случилось. zsh версия сейчас 5.1.1.
Friederbluemle
5

Я .zprofileсовместим с .profile(содержит только изменения PATH), поэтому требуется только:

ln -s .profile .zprofile
Игорь Шубович
источник
0

ЗШ документация у меня на руках только упоминает /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...
Крис Джонсен
источник