Вопрос или проблема
Я часто использую команду 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
.
Применение:
Проанализируем несколько возможных причин и решений данной проблемы:
-
Настройки
tmux
: Один из первых шагов — это проверка конфигурационного файлаtmux
(~/.tmux.conf
). Убедитесь, что нигде явно не задается использованиеsh
в качестве оболочки по умолчанию. Найдите строки с командойset-option -g default-shell
и убедитесь, что они указываются на правильный путь кbash
. -
Переменная
$SHELL
: Проверьте, какой шелл установлен в переменной$SHELL
и в$PATH
внутри и внеtmux
. Это можно сделать командамиecho $SHELL
иwhich bash
. Они должны вернуть путь/opt/homebrew/bin/bash
, если bash настроен корректно. -
Сценарии запуска
tmux
: Проверьте, включает ли какой-либо из ваших файлов конфигурации оболочки или скриптов, запускаемых вtmux
, командуbash
или оболочкуsh
. Часто, файлы, такие как.bashrc
,.bash_profile
,.profile
, могут интерпретироваться в разных ситуациях. Убедитесь, что в них нет команд, которые бы указывалиtmux
использоватьsh
как стандартную оболочку. -
Компактная совместимость POSIX: Если шелл по умолчанию для
tmux
переключается вsh
вместоbash
, возможно, стоит явно указывать путь кbash
при запуске новой сессии вtmux
:tmux new-session -s sessionName /opt/homebrew/bin/bash
. -
Переменная
$SHELLOPTS
: Если причиной является добавление "posix" в$SHELLOPTS
, стоит убедиться, что она не присваивается автоматически где-то в ваших начальных скриптах шелла или в конфигурацииtmux
. -
Инициализация оболочки: Когда вы входите в
tmux
, попробуйте запуститьbash --login
, чтобы загрузить логин-сценарии, которые могут обеспечить корректную работу ваших настроек. -
Отладка и журналирование: Включите отладку для анализа загрузки
tmux
иbash
с помощью командset -x
в начале ваших конфигурационных файлов. Это предложит более детализированную информацию о том, какие настройки применяются и где точно возникает переключение наsh
.
Эта проблема иллюстрирует, как различные конфигурационные среды, такие как tmux
, могут повлиять на работу стандартных инструментов и как важно иметь целостное понимание того, как взаимодействуют эти компоненты в вашей пользовательской среде. Подходя систематично к диагностике и настройкам, можно добиться желаемого поведения и производительности вашего терминального окружения.