Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 自定义bash命令在终端中工作,但在脚本中不工作_Linux_Bash_Shell - Fatal编程技术网

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

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

我有两个脚本:

失败_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
还是bash
bla.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
导出我的函数,然后它也可以用于脚本。