当 locatedb 包含某些字符(制表符)时,locate 输出问号,除非通过管道输出

当 locatedb 包含某些字符(制表符)时,locate 输出问号,除非通过管道输出

我构建了自己的locatedb使用frcode,因此它将在路径之后包含文件大小(它可以帮助我快速查找大文件)。我存储的路径与大小之间用制表符分隔。我注意到,如果我在命令行中使用locate,我会?在选项卡应该在的位置出现一个(问号),除非我把它输送到 cat,这很奇怪。有人知道这是为什么吗?

$ mkdir test-locatedb && cd test-locatedb
$ touch a b c d e f g
$ du -a | awk -v 'OFS=\t' '{print $2,$1}' | /path/to/frcode > test.locatedb
$ locate --database=test.locatedb a
./test.locatedb?1
./a?1
$ locate --database=test.locatedb a | cat
./a     1
./test.locatedb 1    
$ /usr/lib/locate/frcode -v
frcode (GNU findutils) 4.4.2
...

答案1

我怀疑这是locate通过检查输出是否存在来编码的stdout。事实上,locate当输出是 tty 时,有一个条件用问号替换不可打印的字符(请参阅printquoted.cqmark.c)。它也认为 ASCII 控制字符范围内的空白是不可打印的。我认为这是不幸的,因为人们不会期望终端的输出在通过管道传输时发生变化cat。这对于findutils4.6.0 也是如此。我提交了一份错误报告

相关内容