Вопрос или проблема
Я предпочитаю использовать fish shell на macOS большую часть времени, но воздерживаюсь от того, чтобы сделать его оболочкой входа, потому что считаю, что иногда это может вызвать проблемы.
Поэтому я просто добавил exec fish
в самом конце моего .zshrc
, и всё. Это означает, что моя оболочка входа всё ещё zsh, а изменения моего $PATH
всё ещё находятся в .zprofile
, но когда я открываю терминал, мне не нужно вручную переключаться на fish. Это работает для меня.
Но что, если я тем не менее хочу переключиться с fish на zsh по какой-то конкретной причине? Возможно ли это как-то? (Потому что если я просто наберу zsh
и нажму Enter, меня, конечно, сразу снова переключат на fish.)
обновление: Есть обходной путь с использованием zsh -c
, но он работает только с некоторыми командами.
Но что, если я тем не менее хочу переключиться с fish на zsh по какой-то конкретной причине? Возможно ли это как-то?
Вы можете проверить переменную:
[ "$SKIP_FISH" != yes ] && exec fish
А затем, если вы хотите запустить zsh, установите $SKIP_FISH в yes:
SKIP_FISH=yes zsh
Это решение для меня звучит так, будто оно приносит больше проблем, чем решает 🙂 Вы можете просто установить оболочку по умолчанию, которую использует терминал macOS в его конфигурации. Нет необходимости устанавливать оболочку входа на что-то другое или запускать свою оболочку терминала из оболочки входа. То, что запускает терминал, полностью независимо от оболочки входа, просто так получается, что он использует оболочку входа, если вы не скажете явно “эй, я хочу, чтобы ты запустил эту программу!”.
Кроме того, вы можете довольно легко проверить идентификатор родителя процесса zsh
, и только если это исполняемый файл терминала, выполнять ваш fish
. Что-то вроде, вместо вашего плана exec fish
:
{ ps -p $PPID -O command | grep -q "/path/to/macos terminal" } && exec fish
Примечание, опять же, я на самом деле не думаю, что это правильный путь, но это определённо возможно.
(Чтобы выяснить “/path/to/macos terminal”, я бы использовал pstree -h
; не знаю, существует ли это в macOS)
Ответ или решение
Для пользователей, предпочитающих оболочку Fish на macOS, добавление команды exec fish
в конец файла .zshrc
— это удобное решение, позволяющее избежать ручного переключения. Тем не менее, данного подхода может быть недостаточно, если в определенных ситуациях потребуется вернуться к оболочке Zsh. В этой статье рассмотрим возможные способы обхода команды exec fish
и их сильные стороны.
Проблема и механизмы обхода
Добавление exec fish
в файл конфигурации Zsh означает, что при каждом запуске Zsh будет происходить немедленный переход в Fish. Это создает сложности, если вам потребуется занять оболочку Zsh, например, для выполнения специфических команд или скриптов.
1. Использование переменной окружения
Один из наиболее простых способов обойти выполнение команды — использовать переменные окружения. Например, вы можете модифицировать ваш .zshrc
следующим образом:
[ "$SKIP_FISH" != "yes" ] && exec fish
Здесь, если переменная SKIP_FISH
установлена в yes
, Fish не будет запущен.
Пример использования:
Если вам нужно временно переключиться на Zsh, просто выполните следующую команду:
SKIP_FISH=yes zsh
Это установит переменную на время выполнения команд в текущем сеансе и запустит Zsh. Данный метод является изящным и не требует изменения других файлов конфигурации.
2. Условия на основе родительского процесса
Если вы хотите более сложный метод, можно проверить Parent Process ID (PID) процесса Zsh. Вы можете выполнить exec fish
только в случае, если родительский процесс — ваш терминал:
{ ps -p $PPID -O command | grep -q "/Applications/Terminal.app/Contents/MacOS/Terminal" } && exec fish
Этот код проверяет, запущен ли Zsh в контексте вашего терминала, прежде чем запустить Fish. Однако это решение требует уточнения пути к приложению терминала, который может отличаться, и усложняет поддержку.
Сравнение подходов
Каждый из предложенных методов имеет свои плюсы и минусы:
- Переменная окружения: Очень просто реализуется и не требует сложных проверок.
- Проверка родительского процесса: Более гибкое решение, но требует уточнения путей и может быть сложно поддерживать.
Заключение
Добавление команды exec fish
в .zshrc
может значительно упростить переход на Fish для большинства задач, однако реализация обходных путей может быть необходима, если ситуация требует работы с Zsh. Использование переменных окружения или проверки PID процессов — это эффективные методы, помогающие избежать нежелательного перехода на оболочку Fish. Определитесь с тем, какая стратегия подходит именно вам, и настройте свою конфигурацию в соответствии с вашими потребностями.