【问题标题】:Self-defined bash command works in terminal but not in script自定义 bash 命令在终端中有效,但在脚本中无效
【发布时间】:2018-06-04 18:43:35
【问题描述】:

我有两个脚本:

fail_def.sh:

#!/bin/bash -eu
function fail() {
  echo -e "$(error "$@")"
  exit 1
}

bla.sh:

#!/bin/bash -eu
fail "test"

source fail_def.sh之后,我可以在终端中使用fail命令,没有任何问题。但是,当我拨打bla.sh 时,我总是得到line 2: fail: command not found

无论我通过./bla.sh 或bash bla.sh 还是bash ./bla.sh 调用它都没有关系,错误仍然存​​在。

source fail_def.sh 添加到bla.sh 的开头可以解决问题,但我想避免这种情况。

我正在开发一个在 Mac 上运行的 Ubuntu docker 容器,以防万一。

我尝试用谷歌搜索该问题并发现了一些类似的问题,但其中大多数似乎与未获取文件或混合了不同的 shell 实现有关,这两种情况似乎都不是。

我必须做些什么才能让 fail 命令在脚本中工作?

【问题讨论】:

    标签: linux bash shell


    【解决方案1】:

    意料之中!

    shell 运行带有 she-bang 分隔符的脚本,该脚本始终作为单独的进程运行,并且 因此 在不同的 shell 命名空间上。运行脚本的新 shell 没有 source'd 函数。

    如需调试此类信息,请在bla.sh 脚本的#!/bin/bash -eu 行之后添加一行echo $BASHPID 打印当前bash 进程的进程ID 并生成测试结果

    $ echo $BASHPID
    11700
    $ bash bla.sh
    6788
    fail.sh: line 3: fail: command not found
    

    它们是您在不同进程上运行的脚本,其中导入的函数不会在它们之间共享。其中一种方法是您自己对第二个脚本进行错误处理,并通过 source-ing 第二个脚本。在第二个脚本上

    $ cat fail.sh
    echo $BASHPID
    
    set -e
    fail "test"
    set +e
    

    现在运行它

    $ source fail.sh
    11700
    11700
    bash: error: command not found
    

    这很明显,因为error 不是可用的内置shell。观察上述情况下的进程 id 相同。

    【讨论】:

    • 非常感谢!我搜索了一下,发现我可以使用export -f export 我的函数,然后它也适用于脚本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 2021-02-20
    • 2015-08-29
    • 1970-01-01
    相关资源
    最近更新 更多