`ls` 如何知道它是管道传输的还是打印的

Mig*_*ork 4 bash

ls 通常打印如下:

1     1249  1653  23    33    4581  6202  6447  789  836  903        config.gz    kpageflags    sysrq-trigger
10    1253  1658  24    34    4582  6206  648   79   837  91         consoles     loadavg       thread-self
1003  1255  1662  251   347   4583  6207  649   791  84   923        cpuinfo      locks         timer_list
1004  1257  1667  252   35    4689  6209  6799  8    840  925        crypto       meminfo       timer_stats
1005  1261  167   26    357   48    6232  6986  80   841  998        devices      misc          uptime
1006  1263  1670  266   36    49    6242  6992  802  846  acpi       diskstats    modules       version
1008  13    1677  27    37    5     6267  6993  803  848  asound     dma          mounts        vmallocinfo
Run Code Online (Sandbox Code Playgroud)

但是,当您通过管道将它传输到catwith 时ls /proc | cat,它会像得到-1一样打印它(使用 grep 和其他命令也一样):

1
10
1003
1004
1005
1006
1008
1010
1012
106
107
1073
108
109
1152
117
118
1247
1249
1253
Run Code Online (Sandbox Code Playgroud)

我的问题是,它怎么知道它是通过管道传输而不是打印出来的?或者,它是如何发生的?

Cel*_*ada 7

ls和许多其他程序通过调用 C 函数来检测它们的输出(或有时是输入)是否附加到终端isatty(STDOUT_FILENO)。如果输出不是终端(如管道或文件),则默认为对程序更友好的输出格式。

  • 只需查看联机帮助页,它就会告诉您。它是`#include <unistd.h>` (3认同)