我正在编写以下脚本:
#!/bin/bash
db2 connect to andres
a=$(db2 connect)
echo $a
b=$(db2 connect && echo $?)
echo $b
c=$(db2 connect ; echo $?)
echo $c
d=$(db2 connect)
echo $d
我正在做的是使用当前已建立的连接在子 shell 中执行多个命令;但是,只有在发出 db2 命令时,连接才会被识别为已连接。如果我在子 shell 中使用管道或多个命令,则无法识别连接。为什么?
$ ./test
Database Connection Information
Database server = DB2/LINUXX8664 10.5.5
SQL authorization ID = DB2INST1
Local database alias = ANDRES
Database Connection Information Database server = DB2/LINUXX8664 10.5.5 SQL authorization ID = DB2INST1 Local database alias = ANDRES
SQL1024N A database connection does not exist. SQLSTATE=08003
SQL1024N A database connection does not exist. SQLSTATE=08003 4
Database Connection Information Database server = DB2/LINUXX8664 10.5.5 SQL authorization ID = DB2INST1 Local database alias = ANDRES
如您所见,连接在最后一条语句后仍处于事件状态。
最佳答案
The first db2 invocation starts the back-end process. All front-end processes with the same parent are serviced by a single back-end process, and therefore share a single database connection
在 $b 和 $c 的情况下,它们作为单个命令运行(正如 mustaccio 所指出的),它失败了,因为 db2 CPL 只支持管道和重定向。为了证明您的方法仍然可行,您可能需要考虑在变量赋值中使用此处的字符串:
b=$(echo $? <<< $(db2 connect))
或者,像所有其他的一样显示:
b=$(paste <(db2 connect) <(echo $?))
关于linux - 为什么有时无法识别子外壳中的 DB2 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43477708/