Awk, похоже, отключает мой сеанс DB2 при передаче по конвейеру

StackOverflow https://stackoverflow.com/questions/510697

Вопрос

Я пытаюсь запустить следующую команду в KornShell (ksh):

set -A INDEXES `db2 "describe indexes for table ${TABSCHEMA}.${TABNAME} show detail" | awk '{print $1"."$2}'`

Чего я пытаюсь добиться, так это поместить список индексов по определенной таблице в массив, который я могу позже просмотреть.

Проблема в том, что когда я запускаю приведенную выше команду, содержимое массива начинается с сообщения об ошибке 'SQL1024N' (которое сообщает мне, что соединение с базой данных не существует).

Однако, если я удалю awk в конце заявления следующим образом:

set -A INDEXES `db2 "describe indexes for table ${TABSCHEMA}.${TABNAME} show detail"`

это работает просто отлично (ну, в той мере, в какой оно возвращает данные.Очевидно, что без awk Я не фиксирую правильные данные).

Кто-нибудь знает, почему awk оказывает ли это влияние?

Я понимаю, что существует более одного способа получить эти данные, но это ставит меня в тупик относительно того, почему это происходит.

Заранее благодарю.

Это было полезно?

Решение

В этом случае, когда DB2 CLP сообщает, что он не подключен к базе данных, это потому, что оболочка открыла подпроцесс, для которого требуется собственный выделенный внутренний процесс db2bp, который не может получить доступ к соединению, открытому исходным процессом оболочки.Дело не в том, что что-то отключается, а в том, что вновь созданный процесс оболочки (и сопровождающий его процесс db2bp) создаются, но им не сообщается о подключении к базе данных.Один из способов исправить это - явно подключиться (или повторно подключиться) к базе данных, когда вы знаете, что находитесь в одной из таких ситуаций.

set -A INDEXES `db2 connect to watevrDB >/dev/null;db2 -x describe indexes for table ${TABSCHEMA}.${TABNAME} show detail | awk {'print $1"."$2'}`

Я понимаю, что этот вопрос больше касается сценариев и awk с DB2, чем системного каталога, иначе я бы порекомендовал несколько простых запросов к каталогу для получения того же результата.

Другие советы

Я сомневаюсь, что это awk как таковой.Может быть, db2 особенно заботится о том, чтобы стандартный вывод был подключен к tty или консоли?Или, по крайней мере, не любит, когда его подключают к трубе.

Это необычно, и, как говорит Пез, это, вероятно, причуда db2.

Я видел подобные проблемы, когда, напримериспользование time или timex перед командной строкой db2, где у db2 нет определенной базы данных для подключения.

Существует переменная окружения DB2DBDFT, которая устанавливает базу данных по умолчанию для неявных подключений.Мне жаль говорить, что я не уверен, доступна ли эта переменная пользователям, не являющимся администраторами баз данных (предполагая, что вы разработчик приложений).Стоит изучить, устанавливаете ли вы эту переменную через:

db2set DB2DBDFT=${your_db_name}

И повторяем ваш запрос.

Если у вас есть несколько баз данных, к которым может подключаться ваша среда, вы можете отменить настройку переменной DB2DBDFT после завершения своей работы.

Попробуйте выполнить команду db2 с переключателем -x:

db2 **-x** "describe indexes for table ${TABSCHEMA}.${TABNAME} show detail"....

У меня были случаи, когда это излечивало мою неспособность передавать выходные данные в awk.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top