2015-01-07 7 views
2

я выполнить запрос в импала, чтобы проверить, что условие выполняется в таблице и хранить число строк в переменной Баш:импала-оболочка вставляет нечетные управляющие символы в ответ на неинтерактивный запрос

UC=$(impala-shell -r -q "select count(1) from table where condition=1" -d $DB -i $HOST -B) 

UC теперь держит количество строк, где условие один, в этом случае, ни одна строка не удовлетворяет этому условию:

echo $UC 
0 

мое сравнение, чтобы проверить значение UC терпит неудачу, потому что он имеет странные символы управления в передней части.

if [ "$UC" == "0" ]; then echo 1; else echo 0; fi 
0 

echo $UC | hexdump 
0000000 5b1b 313f 3330 6834 3020 000a 
000000b 

При попытке удалить нецифровые от входа, я получаю странный выход

echo $UC | sed 's/[^0-9]*//g' 
10340 

Что здесь происходит, и как я могу отформатировать результат, чтобы сделать мое простое сравнение?

+0

Можете ли вы показать вывод 'echo -n" $ UC "| xxd' – anubhava

+0

@anubhava конечно вывод '0000000: 1b5b 3f31 3033 3468 2030 0a. [? 1034h 0.' – Mike

+1

try' echo $ UC | sed 's/^ \ ([^ 0-9] \ {2 \} \) * // g''. Вы используете двойной символ 8 бит. Лучше всего преобразовать первый код 8bit char. – NeronLeVelu

ответ

4

ESC[?1034h представляет собой последовательность xterm управления означает «Интерпретировать мету ключа, устанавливает восьмой бит.» (Полезный список управляющих последовательностей xterm: here.) Таким образом, предположительно impala-shell заметил, что у вас есть совместимый терминал xterm и пытается инициализировать его для интерактивного использования, хотя опция командной строки -q делает это бессмысленным.

Вы, вероятно, можно избежать проблем, вызывая impala-shell с переменной TERM среды, установленным в ansi, который предохранит программы TERMINFO на основе из излучающих последовательности smm управления:

UC=$(TERM=ansi impala-shell -r -q "select count(1) from table where condition=1" \ 
          -d $DB -i $HOST -B) 

Вы также могли бы быть в состоянии убедить impala-shell, что интерактивность ненужная перенаправлять stdin:

UC=$(impala-shell </dev/null -r -q "select count(1) from table where condition=1" \ 
          -d $DB -i $HOST -B) 

в любом случае, featur e запрос авторам impala-shell представляется разумным. Я думаю, проблема возникает в строке 142 файла impala_shell.py (self.readline = __import__('readline')); import readline имеет побочный эффект инициализации базовой библиотеки readline, которая затем эффективно делает tput smm; если $TERM указывает, что smm существует, он будет отправлен. Нет ничего плохого в инициализации библиотеки readline, если вы собираетесь ее использовать, но в случае неинтерактивной оболочки вы ее не собираетесь использовать. Таким образом, одним из решений было бы проверить интерактивность перед импортом readline (в случае неудачи импорта уже существует резерв). Другой вариант может заключаться в том, чтобы отложить импорт readline (и, следовательно, инициализировать его), пока он не понадобится.

+1

Спасибо, зарегистрированный https://issues.cloudera.org/browse/IMPALA-1650 –

+0

@JeffHammerbacher: Прохладный. Теперь, когда я вижу, что impala-shell является открытым исходным кодом, я взглянул на источник и добавил заметку о возможном исправлении (к моему ответу, а не к сообщению об ошибке), но, надеюсь, кто бы ни справлялся с ошибкой, взгляните на ссылку вы предоставили.) – rici

 Смежные вопросы

  • Нет связанных вопросов^_^