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

标签 bash sed impala

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

相关文章:

linux - 使用sed将元音从大写转换为小写,将小写转换为大写

hive - Parquet Hive 表 : array column not queryable in Impala

sql - Oracle到Impala查询转换

python - 运行多个python的linux bash脚本

linux - 使用 awk 格式化文本

bash - 在 bash 中用(下划线)_ 替换空格的最简单方法

hadoop - 在没有cloudera manager的情况下安装cloudera impala

mysql - 如何在 bash 脚本中将变量传递给 SSH 命令

php - 使用 crontab 从 bash 脚本将 php 文件作为 www-data 执行

sed - 如何从模式空间追加到保留空间而不使用 sed 在保留空间中插入新行?