我在impala中运行了一个查询,以检查表中是否满足条件,并将行数存储在bash变量中:
UC=$(impala-shell -r -q "select count(1) from table where condition=1" -d $DB -i $HOST -B)
uc现在保存条件为1的行计数,在本例中,没有行满足此条件:
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
这里发生了什么?如何格式化结果以进行简单的比较?
1条答案
按热度按时间qacovj5a1#
ESC[?1034h
是一个xterm
控制序列的意思是“解释元键,设置第八位。”(一个有用的xterm
控制序列在这里。)所以大概impala-shell
注意到你有xterm
-兼容的终端,并试图将其初始化为交互式使用,即使-q
命令行选项使其毫无意义。通过调用
impala-shell
与TERM
环境变量设置为ansi
,这将阻止基于terminfo的程序发出smm
控制顺序:你也可以说服
impala-shell
这种交互性是不必要的重定向stdin
:无论哪种方式,都是向
impala-shell
似乎很合理。我认为问题发生在impala_shell.py的第142行(self.readline = __import__('readline')
);import readline
它的副作用是初始化底层的readline库,然后有效地初始化tput smm
; 如果$TERM
表示smm
已存在,将发送。初始化readline
如果要使用它,请使用库,但如果是非交互式shell,则不会使用它。因此,一种解决方案是在导入readline之前检查交互性(在导入失败的情况下已经有了回退)。另一个选择可能是延迟导入readline(并因此初始化它),直到实际需要它。