我正在尝试解决在我看来您无法将打开的 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
或其他东西的行为就好像 bar
和 baz
是从子 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/