Zsh не потрапляє ~ / .profile


144

Я щойно встановив zsh на своїй системі Ubuntu. Здається, zsh не виконує ~ / .profile на init. Наскільки я розумію, це має бути автоматична поведінка. Що я пропускаю?

Відповіді:


204

.profile vs. .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, це означає, що з моменту ясної), ви можете спростити це до 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містить речі, які необхідно виконати для кожного екземпляра оболонки, такі як псевдоніми та функції функції, параметри параметрів оболонки, настройки завершення, швидкі налаштування, прив'язки клавіш тощо.


Чудова відповідь! Я створив ~ / .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 із ефектом shsh-режиму. І він активний лише під час джерела. Таким чином, вам не потрібно зберігати поточний стан опцій, щоб знову відтворити його після отримання джерела.


Я маю це у своєму ~ / .zprofile, але чомусь твердження у ~ / .profile недоступні в моїй оболонці. Ubuntu 15.04; zsh 5.0.7
friederbluemle

Важко діагностувати без коду.
Френк Тербек

Я просто спробував ще раз, і, схоже, це працює зараз. Не впевнений, чи було це зафіксовано в якийсь момент чи що сталося. версія zsh зараз 5.1.1.
friederbluemle


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...
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.