Bash错误“BASH_SOURCE [@]:未绑定变量”包括在函数调用中 - 为什么?

时间:2014-11-09 00:46:09

标签: bash shell

NEQWIN =为什么Bash variable BASH_SOURCE有时不受约束?在这里,我体验过它:

几个月前我设计了&定义了这些方便的无论证的函数:

me_pushd_N78MKZ(){ #N78MKZ={NEQUFJ= pushd the current executing file's folder}
  pushd "$(dirname "${BASH_SOURCE[1]}")">/dev/null #N78MR4[enter link description here][2]=copy N6L19G; {based on http://www.gnu.org/software/bash/manual/html_node/Bash-Variables.html#index-BASH_005fSOURCE} {#N6W3XI="$0" gets the bash script name NOT this file if this file is sourced, as shown at N6W3KE, so replace with present.}
  };export -f me_pushd_N78MKZ
me_popd_N78UN9(){ #N78UOX=undoes/closes me_pushd_N78MKZ
  popd >/dev/null #N78UO9
  };export -f me_popd_N78UN9

- 它们是如此有用,它们在我的.bashrc的开头是它的第一个代码,因为我实际上使用的是下一个命令我的.bashrc:具体来说我的余数代码基本上是me_pushd_N78MKZ; remainder_code; me_popd_N78UN9;所以然后在remaining_code中,每当我执行source a_path时,a_path引用可以相当可靠 - 然后更好 - 使我能够将我的.bashrc(以及大多数任何bash脚本)分解为包含的子模块,以便更好地管理它。调用此函数对还可以为需要访问多个文件的任何脚本启用更简单(相对)的路径引用(如下面的备份脚本bup.bak.N6KDW2.bash)

然而现在(并且似乎仅在最近几天),${BASH_SOURCE[1]}有时会失败:

  1. 错误BASH_SOURCE[1]: unbound variable
  2. 以同样的方式对所有Bash我尝试过:只需Cygwin 4.1.11(2)-release和(最新)4.1.17(9)-release。我最终会在Linux上尝试它,但是在Unix上试用它还不方便,因为它很容易需要设置几个代码文件,而这些代码文件还没有设置好这样的可移植性,因为它还没有需要的。
  3. 不在我的〜/ .bashrc中(仍然可以正常工作)但是在放入〜/ scripts / bup.bak.N6KDW2.bash我编码(然后开始#!/bin/bash\n a_few_to_zero_seemingly_unimportant_commands\n me_pushd_N78MKZ #NEQKEU=\n)时是,和是me_pushd_N78MKZ调用的实际正常位置:.bak_set_N6RV5U.bash也就是bup.bak.N6KDW2.bash来源的配置脚本。
  4. 以及尝试访问该函数中的${BASH_SOURCE[@]}(或此脚本开头调用的其他函数)时,该变量未定义,但非常相关{${FUNCNAME[@]}和{{1}每个都有适当的&多个值。
  5. 那么为什么&何时${BASH_LINENO[@]未定义?为什么它发生在我身上?

    1. 官方文档,特别是for BASH_SOURCE&相关的,我没有回答。
    2. 仍然,我可以想象,根据它的定义,它给出了一个函数的源文件,它可能没有在函数调用中定义(虽然它似乎也会存在,因为我看到${BASH_SOURCE[@]}已经作为它的最后一个值${FUNCNAME[@]}),然而我得到它在函数调用中未定义的东西,没有明确的模式,我什么时候可以看到。
    3. 所以这会感觉像是一个错误,但我记得之前它正在工作,并且在我开始失败之前底层代码(Bash& Cygwin)没有改变,我只是更改了我的调用者代码(虽然可以&# 39;记住我上次改变的内容,所以也许我已经把它弄乱了,或者在某些变化中偶然发现了一个错误。
    4. A respondent gives a possibility I can't well-evaluate “..in a SysV init system you have a prior executing instance of bash, where with systemd the init may be different..”
    5. Google Search("bash_source" "unbound+variable")找不到我在快速浏览时看到的答案和相关问题报告,所以我创建了这个问题,最重要的是收集其他遇到此类或类似问题的人,希望最终寻找解决方案,并在下一点进一步说明理由:
    6. 对于那些对Q& A流程感兴趣的人:因为问题{(1)幸运的是到目前为止还没有给我带来任何showstoppers现在我还没有看到它足够知道这对我或任何人,以及(2)在相当多的额外&难以隔离的专有代码文件,(3)发生在导致它的部分我不知道(否则我不会问)},至于site guideline MCVE我仍然专注于最小但仅作为完整&可验证的目前被(this)需要证明是合理的,即使当时很少或者也许没有人可以故意重现这种不良行为,这个报告仍然可以非常有用“收集其他经历过这种情况的人或希望最终找到解决方案的类似问题“引用前一点。所以似乎理想的指导MCVE应该更新,注意其目标自然也应该与记者平衡。修复需求,因为它的目标非常令人钦佩,确实是理想主义的但很容易。似乎需要此更新,特别是至少存在one user which this site's mechanisms rate VERY high (20K rep points, but somewhat mistakenly?) who mis-claims this Q as a severe “MCSE violation”, from apparently missing (else omitting) the need for this balance, and from definitely severely overly-criticizing on small & personal & useful aesthetics which were also already explained in next & final point NEQWBQ。其次,通过目前的MCVE指南编写,Complete的唯一目标是完成以“重现问题”,因此要进行验证,那么Complete最好作为可验证的最高目标。已经暗示了它,所以理想情况下只要说“提供最小和最小”。可验证的例子(MCEs)“。
    7. 感谢您的帮助。

      NEQWBQ =旁白:这段代码为“NEQWBQ”的是什么?它们是short IDs to uniquely-reference, date-stamp, and portably-track most any point, item, or content,包括我在这里用来唯一ID,因此跟踪点,代码行,变量&功能&文件名。

1 个答案:

答案 0 :(得分:0)

当我从命令行定义函数时(因为未定义lineno?),这是我环境中的这一行引起了问题。

export PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'

取消设置可避免出现警告。