繁体   English   中英

bash/zsh 中的元编程以重新加载 shell 脚本

[英]meta programming in bash/zsh to reload shell script

我有三个 zsh 脚本,

meta_zsh.sh ,

# meta_zsh.sh
meta_s() {
    eval 'echo "${(%):-%x} re-define s()"; s() { echo " calling s() ${(%):-%x}"; }'
}

script_zsh.shscript_zsh_2.sh (内容相同)

# script_zsh.sh and script_zsh_2.sh (the same content)
meta_s
s

在 zsh 中执行以下命令

$ . ./meta_zsh.sh; . ./script_zsh.sh; . ./script_zsh_2.sh

输出

./meta_zsh.sh re-define s()
  calling s() ./script_zsh.sh
./meta_zsh.sh re-define s()
  calling s() ./script_zsh_2.sh

问题是,如何在 bash 中达到同样的效果?

我尝试将${(%):-%x}更改为${BASH_SOURCE[0]}$0 ,但都不起作用。

何必?

以上 meta_xx.sh 来源于 ~/.zshrc (~/.bashrc) 之后,

如果meta_s在其中,我可以在 shell 中键入s以重新加载最近的源脚本。

BASH_SOURCE实际上是调用者堆栈,其中${BASH_SOURCE[0]}是当前文件,因此您可以使用${BASH_SOURCE[1]}

$ cat meta.sh 
meta_s() {
    eval 'CALLER=${BASH_SOURCE[1]}; echo "$CALLER re-define s()"; s() { echo " calling s() $CALLER"; }'
}
$ cat s1.sh 
meta_s
s
$ cat s2.sh 
meta_s
s
$ . meta.sh ; . s1.sh ; . s2.sh 
s1.sh re-define s()
 calling s() s1.sh
s2.sh re-define s()
 calling s() s2.sh

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM