Изменение оболочки по умолчанию без прав доступа chsh или администратора

8

Я видел следующий фрагмент в этой теме: Как перейти с csh на bash в качестве оболочки по умолчанию

sleep 2
if (-x /usr/local/bin/bash) then
  exec /bin/sh -c '. ~/.profile; exec /usr/local/bin/bash'
endif

Насколько я понимаю, если вы разместите этот фрагмент, ~/.loginон будет вызываться bashпри входе в систему.

У меня похожая ситуация, когда я хотел бы использовать похожий фрагмент кода для вызова версии zsh, отличной от версии по умолчанию, с которой я вхожу в систему. Отчасти причина, по которой я сталкиваюсь с этой проблемой, заключается в том, что я не могу выбрать Моя желаемая версия zshв опциях разрешена chsh, и у меня нет прав администратора.

С этим:

  • Как мне изменить приведенный выше фрагмент кода, чтобы сделать это при переключении между различными версиями zsh?
  • Почему execв приведенном выше фрагменте нужны две команды? Что они делают? Кроме того, почему фрагмент выше использует sh и bash (пользователь должен войти в систему с csh)
Амелио Васкес-Рейна
источник

Ответы:

6

Если вы хотите выполнить zsh вместо bash, просто замените /usr/local/bin/bashпуть к zshисполняемому файлу. Обратите внимание, что этот фрагмент относится только к csh; если ваша оболочка входа не является (t) csh, этот код ~/.loginничего не сделает для вас.

Что касается того, почему фрагмент был написан таким образом, вам нужно спросить человека, который его написал. [Проверяет, кто это был.] Ох. Что ж, если вы просто сделаете это, exec /usr/local/bin/bashвы не будете запускать оболочку входа в систему, поэтому ваша .profileне будет выполнена. Но это можно решить проще, выполнив /usr/local/bin/bash --login.

Теперь, если ваша оболочка входа не csh, вам понадобится другой фрагмент кода exec. В оболочках в стиле Борна, в том числе в Zsh:

if [ -x ~/bin/zsh ]; then exec ~/bin/zsh; fi

Сделайте это, exec ~/bin/zsh -lесли хотите, чтобы новый экземпляр zsh читал ваш ~/.zprofile. Обратите внимание, что если вы это сделаете, фрагмент выше должен быть в вашем .profileили .bash_profile; если ваша оболочка входа в систему zsh, не помещайте фрагмент в свой файл .zprofile, иначе убедитесь, что новый экземпляр zsh не будет вызывать это execснова.

Жиль "ТАК - перестань быть злым"
источник
Спасибо, Жиль. Я написал следующее на моем .zprofile: if [[ $ZSH_VERSION != 4.3.14 ]]; then exec /n/sw/zsh-4.3.14/bin/zsh --login fiи это, кажется, работает!
Амелио Васкес-Рейна