Я только что установил zsh в своей системе Ubuntu. Кажется, что zsh не выполняет ~ / .profile в init. Насколько я понимаю, это должно быть автоматическое поведение. Что мне не хватает?
.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
содержит действия, которые необходимо выполнить для каждого экземпляра оболочки, такие как определения псевдонимов и функций, настройки параметров оболочки, настройки завершения, настройки подсказок, привязки клавиш и т. д.
Краткий ответ для нетерпеливых людей:
~/.profile
не загружаетсяzsh
при входе в систему.zsh
загружается~/.zprofile
при входе в систему.zsh
загружается~/.zshrc
при запуске нового терминального сеанса.Нужна дополнительная информация? Посмотрите на превосходный ответ Жиля!
источник
В дополнение к ответу Жиля, с относительно свежей версией zsh вы можете сделать это:
... Который будет источником файла .profile с действующим sh-режимом zsh. И это только активно во время источника. Таким образом, вам не нужно сохранять текущее состояние параметра, чтобы повторно воспроизвести его после поиска.
источник
Я
.zprofile
совместим с.profile
(содержит только изменения PATH), поэтому требуется только:источник
ЗШ документация у меня на руках только упоминает
/etc/profile
и~/.profile
для оболочек входа в ш / КШ режиме совместимости.Оболочка входа в основной режим (argv [0] начинается с
-
) не использует~/.profile
(~/.zprofile
хотя будет использовать ):(нет выхода)
ш / КШ СОВМЕСТИМОСТЬ режим входа оболочки использует .profile:
источник