Это какая-то суета. Правильный способ сделать это внутри tmux (не полагаясь на внешний сценарий оболочки) сочетает в себе функции ответов Винсента и jdloft.
Команда if-shell
в tmux используется как
if-shell [-bF] [-t target-pane] shell-command command [command]
(alias: if)
Execute the first command if shell-command returns success or the second command otherwise. Before
being executed, shell-command is expanded using the rules specified in the FORMATS section, including
those relevant to target-pane. With -b, shell-command is run in the background.
If -F is given, shell-command is not executed but considered success if neither empty nor zero (after
formats are expanded).
Обратите внимание, что расширение команды оболочки tmux расширит переменные формы #{pane_current_path}
, но в противном случае оставит команду в покое.
Что еще более важно, обратите внимание, что tmux использует /bin/sh -c
для выполнения команды оболочки мы уточняем. Таким образом, команда должна быть POSIX-совместимой, поэтому тесты формы [[
не гарантируют быть портативным. Современные системы Ubuntu и Debian, например, используют символическую ссылку /bin/sh
на dash
.
Мы хотим запустить команду оболочки, совместимую с POSIX, которая проверяет версию tmux и возвращает 0 (true), если нужная версия найдена.
if-shell '[ $(echo "$(tmux -V | cut -d" " -f2) >= 2.1" | bc) -eq 1 ]' \
'command if true' \
'command if false'
Пример:
if-shell '[ $(echo "$(tmux -V | cut -d" " -f2) >= 2.1" | bc) -eq 1 ]' \
'set -g mouse on; set -g mouse-utf8 on' \
'set -g mode-mouse on; set -g mouse-resize-pane on; set -g mouse-select-pane on; set -g mouse-select-window on'
Это правильно учитывает тот факт, что мы выполняем арифметику с плавающей запятой, поэтому требуется bc
. Кроме того, нет необходимости в конструкции if/then/else/fi, поскольку оператор [
сам создает истинное значение.
Пара заметок
- Строки, продолжающиеся на следующую строку, не могут иметь завершающие комментарии, иначе tmux выдаст сообщение об ошибке «неизвестная команда».
- «Команда, если ложь» может быть опущена.
- Несколько команд для истинного или ложного можно комбинировать с помощью
;
- Команда запускается в базовой оболочке с использованием
/bin/sh -c
. Работа других подходов, использующих [[
или другой синтаксис, отличный от POSIX, не гарантируется.
EDIT: в предыдущей версии этого ответа использовалось [[
, которое не работает в системах, не использующих bash. Замена на [
решает эту проблему.
person
Micah Smith
schedule
13.10.2016
[[ ]]
, и(( ))
? Я думаю, что(( ))
будет достаточно, если предположить, чтоif
(то естьif-shell
?) проверяет код возврата. - person Etan Reisner   schedule 26.01.2016if "(( $(tmux -V | cut -c 6-) < 2.1 ))" "set -g mode-mouse on; set -g mouse-resize-pane on; set -g select-pane on; set -g select-window on"
устраняет проблему. Можете ли вы опубликовать свой комментарий в качестве ответа. - person mrt181   schedule 27.01.2016(( ))
не может обрабатывать десятичные числа, поэтому, если это работает, это другая причина (или случайность). Есть ли у tmux способ проверить функции? (Я предполагаю, что вы хотите, чтобы это было включено только в версиях, которые его поддерживают.) - person Etan Reisner   schedule 27.01.2016