2017-04-18 38 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 $?)) 
相關問題