Как установить и использовать переменную в tmux.conf в зависимости от того, установлена ​​ли переменная окружения - PullRequest
3 голосов
/ 25 апреля 2019

(Отказ от ответственности: я полностью осознаю, что есть решения проблемы, которую я опишу ниже, которая включает в себя написание и вызов сценариев оболочки, которые взаимодействуют с работающим сервером tmux, или устанавливают необходимые переменные среды перед запуском сервера tmux. Я специально разместив эти вопросы, чтобы увидеть, возможно ли решить эту проблему без использования таких сценариев.)

Краткое описание проблемы

В моем файле .tmux.conf я пытаюсь установить для локальной переменной VALUE различные значения в зависимости от того, была ли установлена ​​переменная окружения FOO перед вызовом tmux или нет. Затем я хочу использовать VALUE в других командах tmux. К сожалению, я либо не могу правильно установить VALUE, либо получить доступ к нему после того, как он был установлен.

Предыдущие попытки

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

Попытка 1

Сначала я попытался использовать команду if-shell. Я пытался использовать эту команду как с флагом -b, так и без него; результат был одинаковым в любом случае.

Я видел из примеров, что я могу назначать переменные с синтаксисом VALUE=bar. Учитывая это, вот минимальный пример моей конфигурации:

if-shell '[ -z "$FOO" ]' \
    'VALUE=bar' \
    'VALUE=baz'

set-environment -g RESULT $VALUE

Терминальная сессия:

$ echo $FOO

$ tmux
[detached (from session 0)]
$ tmux showenv -g VALUE
VALUE=bar
$ tmux showenv -g RESULT
RESULT=
$ killall tmux
$ export FOO=foo
$ echo $FOO
foo
$ tmux
[detached (from session 0)]
$ tmux showenv -g VALUE
VALUE=baz
$ tmux showenv -g RESULT
RESULT=

Так что, хотя VALUE, кажется, был установлен правильно, RESULT не может получить доступ к VALUE.

Попытка 2

На странице руководства также упоминается, что команды могут быть условно выполнены с помощью операторов %if. Используя этот формат, я попробовал следующую конфигурацию:

%if #{#(if [ -z "$FOO" ]; then echo 1; else echo 0)}
VALUE=bar
%else
VALUE=baz
%endif

set-environment -g RESULT $VALUE

Для выражения в операторе %if я пробовал несколько вариантов, например

  • #{#([ -z "$FOO" ])} (Я полагаю, что это не должно работать, поскольку эта команда не выдает никаких результатов, но ее стоит попробовать.)
  • #{==:#(if [-z "$FOO" ]; then echo 1; else echo 0),1} (на всякий случай сработает явное сравнение)

Даже с этими вариациями, независимо от того, был установлен FOO или нет, я получил следующее:

$ tmux
[detached (from session 0)]
$ tmux showenv -g VALUE
VALUE=baz
$ tmux showenv -g RESULT
RESULT=baz

Таким образом, хотя VALUE был доступен, он всегда был baz.

К сожалению, мне не удалось найти полезных примеров, касающихся форматов, используемых в условных выражениях. Man-страница описывает, как получить доступ к переменным tmux и некоторые советы по форматированию; однако, что касается доступа к переменным среды, все, что я мог найти, это способ использования команд оболочки:

Кроме того, первая строка вывода команды оболочки может быть вставлена ​​с использованием #(). Например, #(uptime) вставит время работы системы. При построении форматов tmux не ожидает завершения выполнения команд #(); вместо этого используется предыдущий результат выполнения той же команды или заполнитель, если команда не была выполнена ранее.

Я не уверен, означает ли это, что мне нужно дважды вызывать команды в #(), чтобы избежать использования значения заполнителя, что может быть возможной ошибкой с моей стороны.

Мне также не удалось найти способ легко распечатать результат команд #{} для отладки этой части оператора.

Краткое изложение вопросов

Хотя я был бы признателен за любые указания на информацию, которая может помочь мне решить эту проблему, наиболее насущные вопросы для меня:

  • Почему VALUE настроен правильно, но не доступен для RESULT в Попытке 1?
  • Как записать мои условия в Попытке 2, чтобы убедиться, что VALUE установлен правильно?

Ответы [ 2 ]

2 голосов
/ 25 апреля 2019

tmux запускает конфигурацию, анализируя файл конфигурации в наборе команд, а затем выполняя их (есть очередь команд, поэтому файл конфигурации анализируется и добавляется в очередь, а затем выполняется из очереди),Таким образом, существуют различные этапы анализа и выполнения.

Проблема, с которой вы сталкиваетесь при попытке 1, заключается в том, что if-shell запускается во время выполнения, но расширение $ VALUE происходит во время анализа.Значение VALUE не устанавливается при разборе команды set-environment.

При попытке 2 # () не обрабатывается внутри%, если это не сработает.Однако вы можете использовать переменную непосредственно в форматах (если она установлена).% if происходит во время разбора.

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

Вы можете заставить tmux расширять переменную во время выполнения команды, а не во время разбора.Вы можете сделать это, поместив setenv в run-shell, например что-то вроде:

   if-shell '[ -z "$FOO" ]' \
       'VALUE=bar' \
       'VALUE=baz'
   run 'tmux setenv -g RESULT $VALUE'

Или вы можете выполнить присваивание во время разбора, как вы пытались в попытке 2, но вы не можете использовать # () - вместо этого вам нужно использовать формат:

   %if #{==:#{FOO},}
   VALUE=bar
   %else
   VALUE=baz
   %endif
   setenv -g RESULT $VALUE

(обратите внимание, что X = Y в файле конфигурации эквивалентно setenv -g X = Y, за исключением того, что это происходит при разборе, а не при выполнении - оба задаютглобальная среда. Таким образом, вы можете избавиться от VALUE и выполнить RESULT = bar или setenv -g RESULT bar внутри% if.)

0 голосов
/ 25 апреля 2019

Также вы можете использовать display -p для печати форматов.В master и 2.9 вы можете добавить -v, чтобы увидеть, как они анализируются:

$ tmux setenv -g FOO bar
$ tmux display -pv '#{==:#{FOO},baz}'
# expanding format: #{==:#{FOO},baz}
# found #{}: ==:#{FOO},baz
# modifier 0 is ==
#  expanding format: #{FOO}
#  found #{}: FOO
#  format 'FOO' found: bar
#  replaced 'FOO' with 'bar'
#  result is: bar
#  expanding format: baz
#  result is: baz
# compare == left is: bar
# compare == right is: baz
# replaced '==:#{FOO},baz' with '0'
# result is: 0
0
...