gpt4 book ai didi

git - 如何从 tmux.conf 导出函数

转载 作者:太空狗 更新时间:2023-10-29 13:35:09 28 4
gpt4 key购买 nike

我为 tmux 写了一个插件,tmux-gitbar .它在 tmux 状态栏中显示有关当前目录的 Git 状态的一些信息。状态栏必须每次用户运行命令时更新,为此我添加了一个函数,从$PROMPT_COMMAND变量调用。

我现在在做什么:

在文件 .bashrc 中:

source ~/.tmux-gitbar/tmux-gitbar.sh;

在文件 tmux-gitbar.sh 中:

update_gitbar() {
#
# update tmux status bar
#
}
PROMPT_COMMAND="update_gitbar; $PROMPT_COMMAND"


我想在 不向 .bashrc 添加一行的情况下实现相同的结果。所有这些都应该在tmux.conf 文件中执行。我已经在 tmux.conf 中修改了 $PROMPT_COMMAND:

PROMPT_COMMAND="update_gitbar; $PROMPT_COMMAND"

现在我的问题是将 update_gitbar 函数导出到环境中

我尝试了多种获取脚本源的方法,但没有成功:

run-shell "source ~/.tmux-gitbar/tmux-gitbar.sh"
run-shell "eval $(~/.tmux-gitbar/tmux-gitbar.sh)"
run-shell "eval $(cat ~/.tmux-gitbar/tmux-gitbar.sh)"

我总是得到:

update_gitbar: command not found

问题:

我如何从 tmux.conf 文件导出函数(在另一个文件中声明)并使该函数对环境可用?

如果有帮助,当前代码可在 github 上找到

最佳答案

试图通过 run-shell 解决它是徒劳的。根据定义,任何使用 run-shell 运行的东西都在子 shell/子进程中,并且不会影响 tmux 的环境。

外部shell脚本

老实说,我强烈建议您使用外部 shell 脚本,而不是函数。除此之外,这将允许您对 update_gitbar 进行更改,这些更改会在任何地方立即生效。当然,它的效率稍低,但我认为您不太可能注意到其中的区别。只需将其放入 ~/bin 中,并使 PROMPT_COMMAND 成为 "$HOME/bin/update_gitbar; $PROMPT_COMMAND"

但是,如果您必须坚持使用 shell 函数——我必须指出,这是 bash 的唯一特性,也是主要安全漏洞的来源去年(“ShellShock”;注意:不是该功能的使用,只是它的实际存在,以及非常糟糕的实现,此后已在较新版本中修复),我可以提供两种解决方案。

在运行 tmux 之前导出

第一种也是最简单的方法就是确保在启动 tmux session 的环境中执行导出,而不是在它之后或之内。如果你启动 tmux 而不是 shell 脚本,比如说,你会这样做:

export -f update_gitbar
tmux

作为该启动的一部分,您可能还想放置 update_gitbar 的定义和您的 PROMPT_COMMAND 设置。请注意,一旦 tmux 启动,您将无法更改 update_gitbar 并将其传播到任何使用它的地方——这就是我推荐使用 shell 脚本的原因。但是,您仍然可以使用下面描述的方法修改它对 shell 的含义(例如,在新的 tmux 面板中)。

不可移植的变量导出

最后一个方法,也是最困难和最不便携的,是使用 tmux 的 setenv,或者 .tmux.conf< 中相同的 VAR=value 语法。 Bash 仅通过使用具有特殊格式的普通导出变量来实现其独特的“导出函数”特性。

由于修复了上面提到的“ShellShock”安全漏洞,bash 的不同发行版和版本之间该格式的确切性质是不同的,因此 (a) 你在一个环境中所做的可能在另一个环境中不起作用,并且 (b ) 我不能告诉你确切的导出变量名,你需要做你想做的事。

为了找出你需要的变量格式,在一个有 update_gitbar 的常规 shell 中,运行:

env | sed -n '/^[^=]*update_gitbar/,/^}/p' |
perl -ne 'chomp; $a .= $a? "; $_" : $_; END{$a=~s/=(.*)/='\''$1'\''/; print "$a\n"}'

那个复杂的命令只是在环境中查找导出的 shell 函数并打印它的值。 Bash 在导出变量的值中包含换行符,因此它会继续从环境中抓取,直到它看到只有一个右括号的单行。然后它将所有这些换行符替换为分号,以便您可以将它们全部放在一行中。最后,它替换单引号内的变量值,以避免字符的特殊含义。如果您出于某种原因无法从该命令获取可用值,您可以自己执行该过程。

对我来说,下面的示例说明了我的特定发行版和 bash 版本的格式(注意命令中我将 update_gitbar 更改为 hello)。正如我提到的,您的结果可能会有所不同,因此请务必在您的系统上进行尝试。

在你得到你想要的变量后,只需将它插入你的.tmux.conf,或者使用setenv版本。

hello() {
echo hi;
}
export -f hello
hello
>>>> hi
env | sed -n '/^[^=]*hello/,/^}/p' |
perl -ne 'chomp; $a .= $a? "; $_" : $_; END{$a=~s/=(.*)/='\''$1'\''/; print "$a\n"}'
>>>> BASH_FUNC_hello%%='() { echo hi\!; }'

(以 >>> 为前缀的行是输出的,不是示例中脚本的一部分。)

关于git - 如何从 tmux.conf 导出函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35522187/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com