我试图解决一个问题,在我看来,你无法将开放的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
还是别的什么行为,如果bar
和baz
从子shell执行.
如果我能以某种方式弄清楚如何将db2 open连接传递给subshell,那我会很高兴.
否则,这些shell函数在我看来它们在子shell中运行.有办法吗?
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.