【问题标题】:Weird behaviour of $BASH_SOURCE$BASH_SOURCE 的奇怪行为
【发布时间】:2015-03-08 22:14:12
【问题描述】:

如果你有声明全局函数的 foo.sh:

myfunction(){ echo $*;}
declare -fx myfunction

然后你获取它:

. foo.sh

然后你从 bar.sh 调用全局函数:

myfunction $BASH_SOURCE
myfunction a b c
myfunction $BASH_SOURCE

第三次调用产生一个空行,除非 bar.sh 正在被获取。任何想法如何绕过这个问题?

【问题讨论】:

  • 你期望什么输出?
  • /bin/bar.sh a b c /bin/bar.sh $BASH_SOURCE 如果不是第一次被函数调用,则返回一个空值,除非正在获取脚本
  • 可能与this answer 中讨论的 Bash 错误有关。

标签: bash function global


【解决方案1】:

奇怪,这绝对看起来像一个错误。可能与 bash 的 shell 函数导入机制有关(当发现某个 shell 函数在环境中序列化并反序列化到新进程中时)。

我刚刚发现,如果你从 bar.sh 内部获取 foo.sh,那么错误就会消失:

. foo.sh
myfunction ${BASH_SOURCE[@]}
myfunction a b c
myfunction ${BASH_SOURCE[@]}

输出结果

> ./bar.sh
./bar.sh
a b c
./bar.sh

【讨论】:

    【解决方案2】:

    根据bash手册,BASH_SOURCE是一个数组,每个元素都是与FUNCNAME对应元素关联的文件名,“只有在shell函数执行时才存在”。

    所以BASH_SOURCE 中的任何值在函数调用之外(并且函数参数的评估在函数调用之外)都是未记录的用途;该变量当时没有记录在案的值。

    【讨论】:

    • 那么告诉我,您如何在所有脚本中使用函数?目前,我从所有其他脚本中采购了大约 25 个单行脚本,还有更好的解决方案吗?
    • @Ulrik:我不确定我是否理解这个问题(尽管我的回答是我保留了一个函数文件,这实际上是我的 bash 库,以及特定于项目的文件函数。)当您执行myfunction "$BASH_SOURCE" 时,变量将在shell 的上下文中展开,而不是在函数的上下文中展开,因为在调用函数之前对参数进行评估,就像在几乎所有其他语言中一样。如果您在执行myfunction 期间检查了$BASH_SOURCE,它可能具有预期值。
    • @Ulrik:此外,$FUNCNAME 在您检查 $BASH_SOURCE 时没有任何价值,而我对 bash 手册的阅读是您只查看 $BASH_SOURCE 中对应的项目到$FUNCNAME 中的条目。也许你的期望不同;当然,$BASH_SOURCE 在文档暗示它不应该有一个值时有一个值,这一事实有点出乎意料。如果我的回答还不清楚,请告诉我,我会对其进行编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 2015-07-20
    • 2010-10-03
    • 2021-07-12
    • 2013-10-04
    • 2019-01-23
    相关资源
    最近更新 更多