我的 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。
但是,为了提供一些替代方案,您可以执行以下其中一项操作:
- 编写另一个脚本,将您的
internal
功能放入其中并使用它来代替。 - 写一个图书馆脚本只包含所有函数,没有其他内容,
source
该库脚本应用脚本,以便它的功能在那里可用,并使用这些应用程序脚本。
第二种选择还为您提供了更多的代码卫生和更好的可重用性。