Zsh не попадает в ~/.profile

Zsh не попадает в ~/.profile

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

решение1

.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против..zshrc

Файл ~/.profileзагруженавторизоватьсяshells. Оболочка входа — это первый процесс, который запускается при входе в текстовом режиме, например, в текстовой консоли или через ssh. По умолчанию на большинстве машин Linux оболочкой входа является bash, но вы можете изменить ее с помощью команды chshили с помощью другого инструмента, например «Настройки пользователя» в Ubuntu. Когда это оболочка входа, bash считывает, ~/.bash_profileесли она существует, и ~/.profile, тогда как zsh считывает только ~/.zprofile(потому что ее синтаксис не полностью совместим с традиционным sh). В большинстве конфигураций ~/.profileтакже загружается скриптами запуска сеанса X при входе в графический менеджер отображения.

Когда вы запускаете эмулятор терминала и получаете приглашение оболочки, или когда вы запускаете оболочку явно, вы получаете оболочку, которая не является оболочкой входа. Поскольку ~/.profile(или ~/.zprofile) предназначено для команд, которые вы хотите выполнить при входе в систему, оболочка без входа не читает этот файл. Вместо этого, когда вы запускаете интерактивный zsh, он читает ~/.zshrc. (Zsh читает ~/.zshrcво всех интерактивных оболочках, являются ли они оболочками входа; bash, как ни странно, никогда не читает ~/.bashrcв оболочках входа.)

Обычно ~/.profileсодержит определения переменных среды и может запускать некоторые программы, которые вы хотите запустить один раз при входе в систему или для всего сеанса; ~/.zshrcсодержит действия, которые необходимо выполнить для каждого экземпляра оболочки, такие как определения псевдонимов и функций, настройки параметров оболочки, настройки завершения, настройки приглашений, привязки клавиш и т. д.

решение2

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

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

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

решение3

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

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

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

решение4

Theзшдокументация, которая у меня есть под рукой, упоминает только /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...

Связанный контент