2017-04-18 69 views
0

我写了下面的脚本:为什么有时在子shell一个DB2连接不识别

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

正如你所看到的,连接仍然是最后的语句之后活跃。

+0

尝试双引号的回声变量(例如'echo'$ a“')... –

+0

@ I'L'I这并不解决在子外壳中发出两个命令时未检测到连接的问题。 – AngocA

+1

因为Bash优化了括号内的单个命令,所以不会在子shell中运行。你可以通过比较'(ps -f)|来轻松验证grep '和'(ps -f | grep )' – mustaccio

回答

0

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

第一db2调用启动后端工艺。具有相同父的所有前端处理由一个单一的后端 过程提供服务,并且因此共享单个数据库连接

在$ B的情况下,和$ C它们正在运行为单个命令(正如mustaccio所指出的那样),它会失败,因为在db2 CPL中只支持管道和重定向。为了证明你的方法仍然是可以实现的,你可能要考虑使用此字符串中的变量赋值:

b=$(echo $? <<< $(db2 connect)) 

,或显示所有其他人一样:

b=$(paste <(db2 connect) <(echo $?))