我了解到这sudo echo hello > root-owned-file.txt
不起作用,因为重定向不继承root权限,所以你需要更多类似echo hello | sudo tee root-owned-file.txt
or 的东西echo hello | sudo cp /dev/stdin root-owned-file.txt
。但是,--color=tty
当重定向到 tty 时,grep 可以添加颜色,但不能重定向到其他目的地。重定向是否与主题进程完全分离?如果是,grep 如何“知道”何时省略颜色?
我的直觉是,重定向不仅仅是通道 1/2/3;还有更多内容。我当前的理论是 grep 将彩色输出和普通输出发送到通道 1 的多个变体,并且父 shell 根据目标是否与 tty 关联选择正确的变体来重定向到目标。或者,父 shell 可能会准备目标进程/文件并向源进程发送某种信号或文件描述符;然而,这会对管道的顺序性质产生影响,我认为管道的顺序性质更严格。例如,管道中的下一个命令可能会在生成文件描述符之前设置一个标志,并且源命令可能取决于该标志的原始值,如果管道顺序不严格,则会导致竞争条件。
答案1
grep
只是使用isatty(3)
判断其标准输出是否为tty。如果是,则使用颜色(使用tty
或auto
),否则不使用。