linux - 为什么有时无法识别子外壳中的 DB2 连接

标签 linux bash db2 db2-luw subshell

我正在编写以下脚本:

#!/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

如您所见,连接在最后一条语句后仍处于事件状态。

最佳答案

摘自:https://www.ibm.com/support/knowledgecenter/en/SSEPGG_9.7.0/com.ibm.db2.luw.admin.cmd.doc/doc/r0010412.html

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/

相关文章:

linux - 断开连接时启动网络连接的脚本

bash - Debian:使用 TCP 的 Bash 电子邮件

bash - 如何从 Bash 运行 ZooKeeper 的 zkCli.sh 命令?

java - db2 jdbc 连接错误

mysql - 连接表而不获取不匹配的记录

java - 防止并发插入中的句点交叉

linux - 是否可以从网上下载文件的一部分?

c - 多线程情况下修改栈

linux - XDMCP 是否有任何安全的替代方案?

mysql 两次询问密码,即使它已经提供