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

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

Я часто использую команду 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):

  1. Tmux и оболочка по умолчанию: tmux — это мультиплексор терминалов, и при запуске новой сессии он может использовать оболочку, отличную от оболочки входа пользователя. Это может происходить по нескольким причинам. Одна из них — это конфигурация самого tmux, которая определяется переменной default-shell.

  2. Переменная окружения $SHELL: Это переменная среды, которая обычно используется для указания текущей пользовательской оболочки. Однако, её значение может быть незафиксированным в случаях запуска терминальных сессий через определённые утилиты или сам tmux, который может игнорировать текущее значение $SHELL.

  3. POSIX режим: Как видно из вашего вывода, запуск в tmux добавляет posix в $SHELLOPTS. POSIX-совместимые режимы оболочки могут влиять на синтаксис команд, что приводит к ошибкам, как в вашем примере с командой z и командной подстановкой с использованием <.

  4. Переопределение команды по умолчанию: Менеджер конфигураций 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):

Для решения этой проблемы можно предпринять следующие шаги:

  1. Настройка tmux:

    • Проверьте ваш файл конфигурации .tmux.conf, чтобы убедиться, что set-option -g default-shell указывает на желаемую оболочку bash. Пример:
      set-option -g default-shell /opt/homebrew/bin/bash
  2. Переопределение tmux-sensible:

    • Ваша текущая установка с tmux-sensible перезаписывает начальную команду. Попробуйте определить в конфигурации tmux начальную команду без использования reattach-to-user-namespace или измените её на:
      set-option -g default-command "/opt/homebrew/bin/bash"
  3. Коррекция переменных среды:

    • Убедитесь, что переменная среды SHELL правильно настроена в вашей системе. Проверьте файл /etc/passwd с помощью команды chsh -l и chsh -s /opt/homebrew/bin/bash.
  4. Диагностика и отладка:

    • Попробуйте временно удалить или переименовать tmux конфиг для проверки изменений. Это поможет изолировать проблему.
    • Используйте команды which bash или type bash, чтобы подтвердить путь к установленной оболочке.
  5. Используйте PAM reattach:

    • Поскольку упомянут pam_reattach, убедитесь, что он правильно настроен для работы с вашей оболочкой и спецификой системы.

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

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

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

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