Вопрос или проблема
Эта команда работает как ожидалось, если я запускаю ее в командной строке tmux
:
list-panes -a -F "pane ID: #{p3:pane_id} TTY: #{p11:pane_tty}"
Вывод:
pane ID: %1 TTY: /dev/pts/35
pane ID: %2 TTY: /dev/pts/36
pane ID: %3 TTY: /dev/pts/37
pane ID: %4 TTY: /dev/pts/38
Но мне не удается заставить их работать в display-menu
. Проблема кажется очевидной (по крайней мере, с точки зрения моего оболочки): требуется дополнительный уровень экранирования, чтобы list-panes
видел строку формата, а не ее разрешенное значение. Но, очевидно, я делаю что-то не так:
bind-key C-t display-menu -T 'Test' \
'List panes with tty' '' "list-panes -a -F 'pane ID: \#\{p3:pane_id\} TTY: \#{p11:pane_tty}"
bind-key C-t display-menu -T 'Test' \
'List panes with tty' '' {
list-panes -a -F 'pane ID: #{p3:pane_id} TTY: #{p11:pane_tty}'
}
Вывод:
pane ID: %1 TTY: /dev/pts/35
pane ID: %1 TTY: /dev/pts/35
pane ID: %1 TTY: /dev/pts/35
pane ID: %1 TTY: /dev/pts/35
Ответ или решение
Теория
Вопрос возникает в контексте использования tmux
, мощного инструмента для терминального мультиплексирования. Специфика проблемы заключается в использовании команды display-menu
для отображения информации о панелях через форматную строку. Форматная строка, содержащая переменные в фигурных скобках с #
, должна быть правильно интерпретирована, чтобы избежать некорректного вывода.
Главная задача – убедиться, что форматная строка передается в команду list-panes
без предварительной интерпретации оболочкой или самим tmux
. Проблема с интерпретацией заключается в необходимости использовать дополнительную экранизацию, чтобы tmux
корректно распознавал вложенные символы, и сам список панелей оставался черновиком, интерпретируемым только тогда, когда это необходимо.
Примеры
Ваша исходная команда list-panes -a -F "pane ID: #{p3:pane_id} TTY: #{p11:pane_tty}"
безукоризненно работает в командной строке tmux
. Отличие возникает, когда вы пытаетесь интегрировать аналогичное выражение в команду display-menu
.
Исходный код, который был использован:
bind-key C-t display-menu -T 'Test' \
'List panes with tty' '' "list-panes -a -F 'pane ID: \#\{p3:pane_id\} TTY: \#{p11:pane_tty}"
и
bind-key C-t display-menu -T 'Test' \
'List panes with tty' '' {
list-panes -a -F 'pane ID: #{p3:pane_id} TTY: #{p11:pane_tty}'
}
Результат выполняется с измененным выводом, который повторяет только первую строку несколько раз вместо вывода всех уникальных панелей. Это указывает на то, что форматная строка не воспринимается так, как предполагается.
Применение
Ваша цель – организовать экранирование таким образом, чтобы display-menu
транслировал форматную строку в list-panes
корректно без преждевременной интерпретации. Рассмотрим способ решить данную проблему.
-
Дополнительное экранирование: Для того чтобы передавать форматную строку напрямую в команду
list-panes
, необходимо обеспечить, чтобыtmux
не интерпретировал встроенные идентификаторы панелей раньше времени. Это достигается через экранирование curly braces и использование двойных кавычек для оценки значений переменных. -
Корректная интерполяция: Убедитесь, что вы используете одноуровневую структуру экранирования. Попробуйте следующую модификацию:
bind-key C-t display-menu -T 'Test' \ 'List panes with tty' '' \ 'run-shell "list-panes -a -F \"pane ID: \#{p3:pane_id} TTY: \#{p11:pane_tty}\""'
-
Debugging: Проверяйте вывод на каждом этапе изменения команд. Используйте временные настройки, такие как запись в логи, для отслеживания некорректных выводов.
Заключение
В этом процессе вы воспроизводите тела команд таким образом, чтобы они не интерпретировались преждевременно, тем самым обеспечивая корректное отображение всех требуемых данных. Уделите особое внимание необходимости использования различных методов экранирования в зависимости от контекста вызова – будь то непосредственная CLI или командная структура в скрипте tmux
.
Решив задачу правильно, вы сможете не только разобраться с текущей трудностью, но и более уверенно использовать аналогичные методы для решения других проблем, связанных с многоуровневым экранированием и интерпретацией команд. Это повысит общую эффективность работы с tmux
, расширяя ваши возможности в управлении и контроле за сессиями.