impala shell将奇数控制字符插入到对非交互式查询的响应中

n3h0vuf2  于 2021-06-26  发布在  Impala
关注(0)|答案(1)|浏览(317)

我在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

这里发生了什么?如何格式化结果以进行简单的比较?

qacovj5a

qacovj5a1#

ESC[?1034h 是一个 xterm 控制序列的意思是“解释元键,设置第八位。”(一个有用的 xterm 控制序列在这里。)所以大概 impala-shell 注意到你有 xterm -兼容的终端,并试图将其初始化为交互式使用,即使 -q 命令行选项使其毫无意义。
通过调用 impala-shellTERM 环境变量设置为 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)

无论哪种方式,都是向 impala-shell 似乎很合理。我认为问题发生在impala_shell.py的第142行( self.readline = __import__('readline') ); import readline 它的副作用是初始化底层的readline库,然后有效地初始化 tput smm ; 如果 $TERM 表示 smm 已存在,将发送。初始化 readline 如果要使用它,请使用库,但如果是非交互式shell,则不会使用它。因此,一种解决方案是在导入readline之前检查交互性(在导入失败的情况下已经有了回退)。另一个选择可能是延迟导入readline(并因此初始化它),直到实际需要它。

相关问题