ara*_*one 5 git bash prompt tmux
我为 tmux 编写了一个插件tmux-gitbar。它在 tmux 状态栏中显示了有关当前目录的 Git 状态的一些信息。每次用户运行命令时都必须更新状态栏,为此我添加了一个从$PROMPT_COMMAND变量调用的函数。
.bashrc:source ~/.tmux-gitbar/tmux-gitbar.sh;
Run Code Online (Sandbox Code Playgroud)
tmux-gitbar.sh:update_gitbar() {
#
# update tmux status bar
#
}
PROMPT_COMMAND="update_gitbar; $PROMPT_COMMAND"
Run Code Online (Sandbox Code Playgroud)
我想在不添加一行的情况下.bashrc实现相同的结果。所有都应该在tmux.conf文件中执行。我已经设法$PROMPT_COMMAND通过在以下方式进行修改tmux.conf:
PROMPT_COMMAND="update_gitbar; $PROMPT_COMMAND"
Run Code Online (Sandbox Code Playgroud)
现在我的问题是将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)"
Run Code Online (Sandbox Code Playgroud)
我总是得到:
update_gitbar: command not found
Run Code Online (Sandbox Code Playgroud)
我如何从 tmux.conf 文件导出一个函数(在另一个文件中声明)并使该函数可用于环境?
如果这有帮助,当前代码可在github 上找到
小智 5
试图通过 run-shell 解决它是徒劳的。根据定义,使用 run-shell 运行的任何东西都在子 shell/子进程中,并且不会影响 tmux 的环境。
老实说,我强烈建议您使用外部 shell 脚本,而不是函数。除此之外,这将允许您进行更改,update_gitbar以便在任何地方立即生效。当然,它的效率略低,但我认为您可能不会注意到其中的差异。把它扔进去~/bin,比如说,然后让它PROMPT_COMMAND成为"$HOME/bin/update_gitbar; $PROMPT_COMMAND"。
但是,如果你一定要坚持使用shell函数-我必须指出,是bash-唯一的功能,并且也是源主要安全漏洞去年(“弹震”;注意:不使用此功能,只需它的实际存在和非常破碎的实现,此后已在较新版本中修复),我可以提供两种解决方案。
第一种也是最简单的方法是确保在启动 tmux 会话的环境中进行导出,而不是在其之后或内部进行导出。如果您启动 tmux 与 shell 脚本,例如,您只需执行以下操作:
export -f update_gitbar
tmux
Run Code Online (Sandbox Code Playgroud)
作为该启动的一部分,您可能还想放置 的定义update_gitbar和您的PROMPT_COMMAND设置。请注意,一旦 tmux 启动,您将无法更改update_gitbar并将其传播到任何使用它的地方——这就是我推荐使用 shell 脚本的原因。但是,您仍然可以使用下面描述的方法修改其对新shell 的含义(例如,在新的 tmux 窗格中)。
最后一个方法,最难和最便携,是使用TMUX的setenv,或相同VAR=value的语法.tmux.conf。Bash 仅通过使用具有特殊格式的普通导出变量来实现其独特的“导出功能”功能。
由于修复了上面提到的“ShellShock”安全漏洞,该格式的确切性质在不同发行版和 bash 版本之间有所不同,因此 (a) 您在一个环境中所做的在另一种环境中可能无法正常工作,并且 (b) 我可以不会告诉您执行所需操作所需的确切导出变量名称。
为了找出您需要的变量格式,在具有 的常规 shell 中update_gitbar,运行:
env | sed -n '/^[^=]*update_gitbar/,/^}/p' |
perl -ne 'chomp; $a .= $a? "; $_" : $_; END{$a=~s/=(.*)/='\''$1'\''/; print "$a\n"}'
Run Code Online (Sandbox Code Playgroud)
这个复杂的命令只是在环境中查找导出的 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\!; }'
Run Code Online (Sandbox Code Playgroud)
( ->>>>前缀行是输出,不是示例中脚本的一部分。)
| 归档时间: |
|
| 查看次数: |
1056 次 |
| 最近记录: |