使用 --color= 时 grep 如何“知道”它被重定向到哪里?

使用 --color= 时 grep 如何“知道”它被重定向到哪里?

我了解到这sudo echo hello > root-owned-file.txt不起作用,因为重定向不继承root权限,所以你需要更多类似echo hello | sudo tee root-owned-file.txtor 的东西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。如果是,则使用颜色(使用ttyauto),否则不使用。

相关内容