使用此 lz4 命令:
$ apt search ^lz4$
Sorting... Done
Full Text Search... Done
lz4/focal,now 1.9.2-2 amd64 [installed,automatic]
Fast LZ compression algorithm library - tool
$ lz4 --version
*** LZ4 command line interface 64-bits v1.9.2, by Yann Collet ***
此命令通常会创建一个filename.lz4
文件(就像 gzip 一样):
$ lz4 -9 -k filename
但是,这个命令却没有这样做,而是在我没有告诉它的情况下写入标准输出:
$ t=$(lz4 -9 -k filename)
Warning : using stdout as default output. Do not rely on this behavior: use explicit `-c` instead !
bash: warning: command substitution: ignored null byte in input
为什么会这样?这是错误吗?还是有原因记录在某处?
答案1
这种行为似乎是一种特性,而不是错误。除了源代码:
/* No output filename ==> try to select one automatically (when possible) */
while ((!output_filename) && (multiple_inputs==0)) {
if (!IS_CONSOLE(stdout)) {
/* Default to stdout whenever stdout is not the console.
* Note : this policy may change in the future, therefore don't rely on it !
* To ensure `stdout` is explicitly selected, use `-c` command flag.
* Conversely, to ensure output will not become `stdout`, use `-m` command flag */
DISPLAYLEVEL(1, "Warning : using stdout as default output. Do not rely on this behavior: use explicit `-c` instead ! \n");
output_filename=stdoutmark;
break;
.
.
}
在 Linux 上,IS_CONSOLE
用于isatty
确定文件描述符是否连接到终端。
正如评论中所建议的,您可以-m
在没有 tty 的情况下使用该选项强制生成输出文件:
t=$(lz4 -9 -k -m filename)