116

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

5 ответов5

167

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

45

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

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

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

16

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

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

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

4

У меня .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...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .