我注意到apt输出在单独执行Bash和输出重定向到文件时是不同的。
例如:
$ apt install ./*.deb --simulate 1>111.txt 2>222.txt添加重定向会导致流2文件中的文本WARNING: apt does not have a stable CLI interface. Use with caution in scripts.,而运行apt w/out重定向则不会在shell窗口中显示此文本。
为什么输出依赖于重定向?也许apt把重定向看作它的参数?如何将重定向写成不被注意到shell命令行的其他部分?
我在Ubuntu18中看到了它,apt是一个特定的应用程序,但可能这个问题对于Unix来说很普遍,所以我只在标签中添加了shell。
发布于 2018-08-04 14:00:29
apt的设计历史上考虑到了交互式命令行的使用,因此出现了编码警告,这是在apt中进行的,而不是由shell完成的。
然而,apt并不一定解析命令行;当它调用apt时,shell已经完成了这一工作。apt正在做的是检测stdout流是否已被更改/重定向。
至于在脚本中使用apt,您已经得到了类似的旧命令apt-get,它做的事情大致相同,并且在stdout被重定向时没有给出警告。
TLDR不是用stderr编写错误消息的shell,而是apt命令。
您能够在shell中捕获apt stderr输出的事实是Unix是一个多任务操作系统的工件,并不意味着它是生成该输出的shell。
PS。在执行命令时,可以看到apt正在编写该消息:
strace apt get install bash > a
....
write(2, "\n", 1
) = 1
write(2, "WARNING: ", 9WARNING: ) = 9
write(2, "apt", 3apt) = 3
write(2, " ", 1 ) = 1
write(2, "does not have a stable CLI inter"..., 38does not have a stable CLI interface. ) = 38
write(2, "Use with caution in scripts.", 28Use with caution in scripts.) = 28
write(2, "\n", 1
) = 1
write(2, "\n", 1
) = 1发布于 2018-08-14 00:15:59
“如何将重定向写成不被注意到shell命令行的其他部分?”
你不需要做任何事情,警告是在stdErr上。试试这个:
apt list adghdgd | grep .
2>/dev/null apt list adghdgd | grep .如果在默认情况下您的分布颜色为grep,您将看到实际到grep的部分会被着色。在第二种形式中,stdErr会被抑制。
Grep的行为也不同,比较如下:
echo hello | grep .
echo hello | grep . | cat第二种形式是不着色的,因为grep注意到它的stdOut不是终端,而是管道。他/她怎么知道?
比较
ls -l /proc/self/fd/1
( ls -l /proc/self/fd/1 ) | cat在第一种形式中,stdOut是tty/pts。在第二部分,是一根管子。
https://unix.stackexchange.com/questions/460503
复制相似问题