Почему tmux запускает sh вместо моей обычной входной оболочки bash?

Вопрос или проблема

Я часто использую команду z (Jump Around), но заметил, что она недавно перестала работать в tmux. Я не могу понять, какое изменение это вызвало, но я знаю, что происходит: что-то связанное с tmux добавляет “posix” в $SHELLOPTS и/или tmux использует sh в качестве оболочки!

Сразу после начала нового сеанса в Tmux:

❯ echo $SHELLOPTS
braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor:posix

~ via  v20.5.0 on ☁️  (eu-north-1) on ☁️
❯ z
-sh: command substitution: line 1: syntax error near unexpected token `<'
-sh: command substitution: line 1: ` < <( _z_dirs ) \awk -v t="$(\date +%s)" -v list="$list" -v typ="$typ" -v q="$fnd" -F"|" ''

Если я либо выйду из TMUX, либо снова введу bash, и выполню две команды, все работает нормально, так как в SHELLOPTs теперь нет “posix:

❯ echo $SHELLOPTS
braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor

Что вызывает это и как я могу этого избежать?

Мои dotfiles не содержат упоминаний о “posix”.

Я не вижу ничего, указывающего на использование sh вместо bash в переменных окружения?

❯ echo $SHELL
/opt/homebrew/bin/bash

❯ env | grep SHELL
STARSHIP_SHELL=bash
SHELL=/opt/homebrew/bin/bash

❯ echo $SHELL
$SHELL                  $SHELLOPTS              $SHELL_SESSION_HISTORY

❯ echo $SHELLOPTS
braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor:posix

Ответ или решение

Теория:

tmux — это популярный инструмент для терминалов, который позволяет пользователям создавать и управлять несколькими терминальными сессиями в одном окне. При запуске новой сессии в tmux, он может использовать необычные конфигурации оболочки, отличающиеся от настроек вашей стандартной оболочки, например, таблицы поиска пути или шелл-опции. Это может повлиять на производительность или совместимость стандартных команд, таких как z от проекта Jump Around. В вашем случае проблема связана с тем, что в tmux в переменной $SHELLOPTS появляется "posix", а также используется оболочка sh вместо ожидаемой оболочки bash.

Пример:

На вашем примере, после запуска новой сессии в tmux, вы обнаруживаете, что команда z не функционирует как положено. Анализ переменной $SHELLOPTS показывает, что добавлен режим "posix", что приводит к проблемам с интерпретацией сложных команд в рамках sh. Попробуйте выполнить ту же команду вне tmux или снова запустите bash внутри tmux, и проблема исчезнет, так как "posix" исчезает из $SHELLOPTS.

Применение:

Проанализируем несколько возможных причин и решений данной проблемы:

  1. Настройки tmux: Один из первых шагов — это проверка конфигурационного файла tmux (~/.tmux.conf). Убедитесь, что нигде явно не задается использование sh в качестве оболочки по умолчанию. Найдите строки с командой set-option -g default-shell и убедитесь, что они указываются на правильный путь к bash.

  2. Переменная $SHELL: Проверьте, какой шелл установлен в переменной $SHELL и в $PATH внутри и вне tmux. Это можно сделать командами echo $SHELL и which bash. Они должны вернуть путь /opt/homebrew/bin/bash, если bash настроен корректно.

  3. Сценарии запуска tmux: Проверьте, включает ли какой-либо из ваших файлов конфигурации оболочки или скриптов, запускаемых в tmux, команду bash или оболочку sh. Часто, файлы, такие как .bashrc, .bash_profile, .profile, могут интерпретироваться в разных ситуациях. Убедитесь, что в них нет команд, которые бы указывали tmux использовать sh как стандартную оболочку.

  4. Компактная совместимость POSIX: Если шелл по умолчанию для tmux переключается в sh вместо bash, возможно, стоит явно указывать путь к bash при запуске новой сессии в tmux: tmux new-session -s sessionName /opt/homebrew/bin/bash.

  5. Переменная $SHELLOPTS: Если причиной является добавление "posix" в $SHELLOPTS, стоит убедиться, что она не присваивается автоматически где-то в ваших начальных скриптах шелла или в конфигурации tmux.

  6. Инициализация оболочки: Когда вы входите в tmux, попробуйте запустить bash --login, чтобы загрузить логин-сценарии, которые могут обеспечить корректную работу ваших настроек.

  7. Отладка и журналирование: Включите отладку для анализа загрузки tmux и bash с помощью команд set -x в начале ваших конфигурационных файлов. Это предложит более детализированную информацию о том, какие настройки применяются и где точно возникает переключение на sh.

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

Оцените материал
Добавить комментарий

Капча загружается...