
Я только что установил 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
Короткий ответ для нетерпеливых:
~/.profile
не загружается приzsh
входе в систему.zsh
загружается~/.zprofile
при входе в систему.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...