Shell函数是否在子shell中运行

lzc*_*lzc 7 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
Run Code Online (Sandbox Code Playgroud)

我简化了我的代码,但上面的内容已经足够了.我从上面开始:

my_driver.sh
Run Code Online (Sandbox Code Playgroud)

现在,我真正的问题是子shell中没有db2连接:

我累了:

. my_driver.sh
Run Code Online (Sandbox Code Playgroud)

没有帮助

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

source foo.sh
Run Code Online (Sandbox Code Playgroud)

$params手动设置:

baz $params
bar $params
Run Code Online (Sandbox Code Playgroud)

然后它确实有效!如此看来,doit还是别的什么行为,如果barbaz从子shell执行.

如果我能以某种方式弄清楚如何将db2 open连接传递给subshel​​l,那我会很高兴.

否则,这些shell函数在我看来它们在子shell中运行.有办法吗?

ric*_*ici 6

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

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

db2要求所有db2命令与db2建立连接的命令具有相同的父命令.您可以使用以下内容记录PID:

echo "Execute db2 from PID $$" >> /dev/stderr
db2 ...
Run Code Online (Sandbox Code Playgroud)

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


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

function f
Run Code Online (Sandbox Code Playgroud)

定义一个函数.标准shell期望

f()
Run Code Online (Sandbox Code Playgroud)

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