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
但是当你通过管道将它例如连接到cat
with时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
我的问题是,它如何知道它是通过管道传输而不是打印?或者说,它是如何发生的?
答案1
ls
许多其他程序通过调用 C 函数来检测其输出(或有时是输入)是否连接到终端isatty(STDOUT_FILENO)
。如果输出不是终端(例如管道或文件),则它默认为对程序更友好的输出格式。