2017-04-18 5 views
0

Je suis en train d'écrire le script suivant:Pourquoi parfois une connexion DB2 dans un sous-shell est pas identifié

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

Ce que je fais est d'exécuter des commandes de multiples à l'intérieur d'un sous-shell en utilisant la connexion établie en cours; cependant, la connexion n'est identifiée comme connectée que si une commande db2 est émise. Si j'utilise un tube ou plusieurs commandes dans le sous-shell, la connexion n'est pas identifiée. Pourquoi?

$ ./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 

Comme vous pouvez le voir, la connexion est toujours active après la dernière instruction.

+0

Essayez de double citant votre variable d'écho (par exemple 'echo" $ a "') ... –

+0

@ I'L'I Cela ne résout pas le problème de ne pas détecter la connexion lorsque deux commandes sont émises dans le sous-shell. – AngocA

+1

Parce que Bash optimise une seule commande entre parenthèses à _not_ dans un sous-shell. Vous pouvez facilement vérifier cela en comparant '(ps -f) | grep 'et' (ps -f | grep ) ' – mustaccio

Répondre

0

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

Le premier appel de db2 démarre le processus de back-end. Tous les processus frontaux avec le même parent sont desservis par un seul back-end processus , et donc partager une seule connexion de base de données

Dans les cas de b $ et $ c ils sont en cours d'exécution en tant que seule commande (comme indiqué par mustaccio), il échoue parce que seul le pipe et la redirection sont supportés dans db2 CPL. Pour prouver que votre approche est encore réalisable, vous voudrez peut-être envisager d'utiliser ici chaîne dans les attributions de variables:

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

ou, affichage comme tous les autres:

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