bash - Shell函数是否在子shell中运行?

标签 bash subshell

我正在尝试解决在我看来您无法将打开的 db2 连接传递给子 shell 的问题。

我的代码组织如下:

驱动脚本(在my_driver.sh中)

# foo.sh defines baz() bar(), which use a db2 connection
# Also the "$param_file" is set in foo.sh!
source foo.sh

db2 "connect to $dbName USER $dbUser using $dbPass"

function doit
{
    cat $param_file | while read params
    do
        baz $params
        bar $params
    done
}

doit

我已经简化了我的代码,但以上内容足以说明我的想法。我开始上面的:

my_driver.sh

现在,我真正的问题是 db2 连接在子 shell 中不可用:

我试过:

. my_driver.sh

没有帮助

如果我从命令行手动执行:

source foo.sh

然后我手动设置了$params:

baz $params
bar $params

然后就可以了!所以看起来 doit 或其他东西的行为就好像 barbaz 是从子 shell 中执行的。

如果我能以某种方式弄清楚如何最好地将 db2 打开连接传递给子 shell,我会很高兴。

否则,这些 shell 函数在我看来是在子 shell 中运行的。有解决办法吗?

最佳答案

shell 不会创建子 shell 来运行函数。

当然,它确实会为许多其他目的创建子外壳,但并非所有这些目的都是显而易见的。例如,它在 | 的实现中创建子 shell。

db2 要求所有 db2 命令与建立连接的 db2 命令具有相同的父级。您可以使用类似的方式记录 PID:

echo "Execute db2 from PID $$" >> /dev/stderr
db2 ...

(只要 db2 命令不在管道或 shell 括号内执行。)


显示的代码中的一个可能问题(会有完全不同的症状)是使用了非标准语法

function f

定义一个函数。一个标准的 shell 期望

f()

Bash 都理解,但是如果您没有 shebang 行或者您使用 sh 命令执行脚本文件,您将最终使用系统的默认 shell,它可能不是 bash。

关于bash - Shell函数是否在子shell中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36158686/

相关文章:

bash - 使用 bash 命令(带管道)的输出作为另一个命令的参数

bash - 带变量的大括号扩展?

bash - Gitlab CI 配置对条件语句无效

bash - 如何将多个命令通过管道传输到 shell 中的单个命令? (嘘,庆典,...)

linux - 影响启动它的交互式 shell 的脚本

linux - 如何在 Linux 中显示过去 5 分钟添加的文件内容而不扫描整个文件?

node.js - 监视/监视某些关键字的后台作业

bash - 检索子 shell stdout 的第一行/最后一行

bash - $> bash script.sh ... fork 的 bash 进程是否会创建子 shell?