自定义bash命令在终端中工作,但不在脚本

时间:2018-06-04 10:25:00

标签: linux bash shell

我有两个脚本:

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命令在脚本中运行?

1 个答案:

答案 0 :(得分:1)

预计!

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

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

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

他们在单独的进程上运行的脚本,其中导入的函数之间不共享。其中一种方法是在第二个脚本上进行自己的错误处理,并通过第二个脚本来源。在第二个脚本

$ cat fail.sh
echo $BASHPID

set -e
fail "test"
set +e

现在正在运行

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

这很明显,因为error不是可用的内置shell。在上述情况下,请注意进程ID相同。