Linux 自定义bash命令在终端中工作,但在脚本中不工作
我有两个脚本: 失败_def.sh:Linux 自定义bash命令在终端中工作,但在脚本中不工作,linux,bash,shell,Linux,Bash,Shell,我有两个脚本: 失败_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时,我总是得到第2行:fail:command not found 不管我是通过/bla.sh还是bashbla.sh或ba
#!/bin/bash -eu
function fail() {
echo -e "$(error "$@")"
exit 1
}
bla.sh:
#!/bin/bash -eu
fail "test"
在source fail_def.sh
之后,我可以在终端中使用fail命令而不会出现任何问题。然而,当我调用bla.sh
时,我总是得到第2行:fail:command not found
不管我是通过/bla.sh
还是bashbla.sh
或bash/bla.sh
调用它,错误仍然存在
将sourcefail_def.sh
添加到bla.sh
的开头可以解决这个问题,但我想避免这个问题
我正在开发一个运行在Mac上的Ubuntu docker容器,以防万一
我试着用谷歌搜索这个问题,发现了一些类似的问题,但大多数问题似乎都与不提供文件源或混合使用不同的shell实现有关,这里的情况似乎都不是这样
要使fail命令在脚本中工作,我必须做些什么?这是意料之中的
shell使用she-bang分隔符运行脚本,该分隔符始终作为单独的进程运行,因此位于不同的shell名称空间中。运行脚本的新shell没有函数source'd
要调试此类信息,请在行之后添加一行echo$BASHPID
,该行在bla.sh
脚本上打印当前bash进程的进程id/bin/bash-eu
,并生成测试结果
$ 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相同。非常感谢您的支持!我搜索了一下,发现我可以使用export-f
导出我的函数,然后它也可以用于脚本。