Вопрос или проблема
Я часто использую команду z
(Jump Around), но заметил, что она перестала работать в tmux
. Я не могу понять, какое изменение это вызвало, но я знаю, что происходит: что-то, связанное с tmux
, добавляет “posix” в $SHELLOPTS
и/или tmux
использует sh
в качестве оболочки!
Сразу после начала новой сессии в Tmux:
❯ echo $SHELLOPTS
braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor:posix
❯ z
-sh: подстановка команд: строка 1: синтаксическая ошибка рядом с неожиданным токеном `<'
-sh: подстановка команд: строка 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 display-message -p "_#{default-shell}_ _#{default-command}_"
_/opt/homebrew/bin/bash_ _reattach-to-user-namespace -l /bin/sh_
Это автоматически добавляется tmux-sensible, который устанавливает это как
reattach-to-user-namespace -l $SHELL
Но почему SHELL установлен в /bin/sh
во время установки default-command
, а не в /opt/homebrew/bin/bash
, как видно выше? Я только что проверил, что ни один из dotfiles не устанавливает эту переменную и что chsh
имеет это в качестве моего текущего параметра.
Может быть, список процессов поможет выяснить это?
❯ pstree -p $PPID
-+= 00001 root /sbin/launchd
\-+= 58399 carlerik tmux
\-+= 58557 carlerik -sh
\-+= 58865 carlerik pstree -p 58399
\--- 58866 root ps -axwwo user,pid,ppid,pgid,command
Я не знаю, объясняет ли это установку $SHELL
?
Это может быть объяснено использованием https://github.com/fabianishere/pam_reattach.
Ответ или решение
Ваша проблема связана с тем, что в tmux запускается оболочка sh
вместо ожидаемой вами оболочки bash
, и это вызывает изменения в поведении некоторых скриптов, например, команды z
. Попробуем разобраться в причинах потери ожидаемой оболочки и изменении значений переменных окружения, а также предложим решения.
Теория (Theory):
-
Tmux и оболочка по умолчанию: tmux — это мультиплексор терминалов, и при запуске новой сессии он может использовать оболочку, отличную от оболочки входа пользователя. Это может происходить по нескольким причинам. Одна из них — это конфигурация самого tmux, которая определяется переменной
default-shell
. -
Переменная окружения $SHELL: Это переменная среды, которая обычно используется для указания текущей пользовательской оболочки. Однако, её значение может быть незафиксированным в случаях запуска терминальных сессий через определённые утилиты или сам tmux, который может игнорировать текущее значение $SHELL.
-
POSIX режим: Как видно из вашего вывода, запуск в tmux добавляет
posix
в $SHELLOPTS. POSIX-совместимые режимы оболочки могут влиять на синтаксис команд, что приводит к ошибкам, как в вашем примере с командойz
и командной подстановкой с использованием<
. -
Переопределение команды по умолчанию: Менеджер конфигураций
tmux-sensible
влияет на запуск оболочек командойreattach-to-user-namespace -l /bin/sh
. Это может изменить ожидаемую оболочку, наsh
при запуске сессии tmux.
Пример (Example):
Вы показали вывод значений переменных окружения и использовали команды для проверки конфигураций. Вывод команды tmux display-message -p "_#{default-shell}_ _#{default-command}_"
указывает, что по умолчанию запускается reattach-to-user-namespace -l /bin/sh
. Это отображает, что фактическая команда, запускаемая в новой сессии tmux, отличается от ваших ожиданий.
Также, вывод pstree -p $PPID
показывает, что процессы, запущенные в tmux, используют -sh
, а не ваш стандартный /opt/homebrew/bin/bash
.
Применение (Application):
Для решения этой проблемы можно предпринять следующие шаги:
-
Настройка tmux:
- Проверьте ваш файл конфигурации
.tmux.conf
, чтобы убедиться, чтоset-option -g default-shell
указывает на желаемую оболочку bash. Пример:set-option -g default-shell /opt/homebrew/bin/bash
- Проверьте ваш файл конфигурации
-
Переопределение tmux-sensible:
- Ваша текущая установка с
tmux-sensible
перезаписывает начальную команду. Попробуйте определить в конфигурации tmux начальную команду без использованияreattach-to-user-namespace
или измените её на:set-option -g default-command "/opt/homebrew/bin/bash"
- Ваша текущая установка с
-
Коррекция переменных среды:
- Убедитесь, что переменная среды
SHELL
правильно настроена в вашей системе. Проверьте файл/etc/passwd
с помощью командыchsh -l
иchsh -s /opt/homebrew/bin/bash
.
- Убедитесь, что переменная среды
-
Диагностика и отладка:
- Попробуйте временно удалить или переименовать tmux конфиг для проверки изменений. Это поможет изолировать проблему.
- Используйте команды
which bash
илиtype bash
, чтобы подтвердить путь к установленной оболочке.
-
Используйте PAM reattach:
- Поскольку упомянут
pam_reattach
, убедитесь, что он правильно настроен для работы с вашей оболочкой и спецификой системы.
- Поскольку упомянут
После внесения изменений, перезапустите tmux и проверьте, сохраняются ли изменения в оболочке и переменных окружения. Это позволит вам работать в удобной среде с предсказуемым поведением команд, такими как z
.
Таким образом, следуя указанным шагам и рекомендациям, вы можете устранить проблему и обеспечить стабильную работу tmux с нужной вам оболочкой.