在 Bash 脚本中运行 tmux 中的函数

在 Bash 脚本中运行 tmux 中的函数

我的 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 函数,该函数将一个函数作为参数,并使用“send-keys”将其加载到 tmux 会话中。显然,当此函数运行时,接收 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

据我所知,您无法将 shell 函数导出到 tmux 实例。至少在 1.9 版的 tmux 手册页中没有对此的引用。

我认为这根本不可能,因为创建 tmux 会话的脚本上下文与 tmux 会话中的上下文完全不同。因此它甚至无法了解这些函数。此外,tmux 甚至可能使用与您正在使用的 shell 不同的 shell。

但是,为了提供一些替代方案,您可以执行以下其中一项操作:

  1. 编写另一个脚本,将您的internal功能放入其中并使用它来代替。
  2. 写一个图书馆脚本只包含所有函数,没有其他内容,source该库脚本应用脚本,以便它的功能在那里可用,并使用这些应用程序脚本。

第二种选择还为您提供了更多的代码卫生和更好的可重用性。

相关内容