(Отказ от ответственности: я полностью осознаю, что есть решения проблемы, которую я опишу ниже, которая включает в себя написание и вызов сценариев оболочки, которые взаимодействуют с работающим сервером 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
установлен правильно?