我有两个脚本:
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命令在脚本中运行?
答案 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相同。