
Мой скрипт bash имеет несколько функций, и мне нужна одна панель tmux для выполнения функции в скрипте bash. Например, код ниже не будет работать и будет сообщено, что команда "internal" не найдена.
common() {
internal() {
echo "Function executed"
}
SESSIONNAME="ses"
tmux new-session -s $SESSIONNAME -n session -d
tmux split-window -t $SESSIONNAME:0 -h
tmux send-keys 'internal' 'C-m'
tmux select-window -t $SESSIONNAME:0
tmux attach -t $SESSIONNAME
}
Так как же мне указать tmux выполнить функцию из скрипта, в котором была вызвана панель tmux?
решение1
Я написал функцию bash, которая принимает функцию в качестве аргумента и загружает ее в сеанс tmux с помощью 'send-keys'. Очевидно, что принимающая панель tmux должна работать под управлением bash или чего-то совместимого, когда эта функция выполняется.
_pass_to_tmux() {
_FUNC_TO_PASS="${1}"
_IFS_BACKUP="${IFS}"
IFS=$'\n'
for i in $(type ${_FUNC_TO_PASS} | tail -n +2); do
tmux send-keys "${i}" C-m
done
IFS="${_IFS_BACKUP}"
}
решение2
Насколько мне известно, экспортировать функции оболочки в экземпляр tmux нельзя. По крайней мере в версии 1.9 страницы руководства tmux об этом нет никаких упоминаний.
Я не думаю, что это вообще возможно, поскольку контекст скрипта, в котором вы создаете сеанс tmux, полностью отличается от контекста внутри сеанса tmux. Таким образом, он даже не может знать об этих функциях. Кроме того, tmux может даже использовать другую оболочку, чем та, которую используете вы.
Однако, чтобы предоставить некоторые альтернативы, вы можете сделать одно из следующего:
- Напишите другой скрипт, вставьте
internal
в него свою функцию и используйте ее. - Написатьбиблиотекаскрипт, содержащий все ваши функции, но ничего больше,
source
этот библиотечный скрипт вприложениескрипты, чтобы его функции стали доступны там, и вместо этого используйте эти скрипты приложений.
Второй вариант также обеспечивает большую гигиену кода и лучшую возможность повторного использования.