我在 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
这里发生了什么以及如何格式化结果以进行简单比较?
最佳答案
ESC[?1034h
是一个 xterm
控制序列,含义是“解释 meta 键,设置第八位”。 (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)
您还可以通过重定向 stdin
来说服 impala-shell
不需要交互:
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 (self.readline = __import__('readline')
); 的第 142 行; import readline 具有初始化底层 readline 库的副作用,该库随后会有效地执行 tput smm ;如果$TERM
表明smm
存在,则发送。如果您要使用 readline
库,那么初始化它并没有什么问题,但如果是非交互式 shell,您就不会使用它。因此,一种解决方案是在导入 readline 之前检查交互性(如果导入失败,已经有回退措施)。另一种选择可能是延迟导入 readline(从而初始化它),直到实际需要它为止。
关于bash - impala-shell 将奇数控制字符插入到对非交互式查询的响应中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27822165/