如果通过管道传输输出,Unix 程序如何知道要更改输出?

如果通过管道传输输出,Unix 程序如何知道要更改输出?

调用类似aggrep替代方案)的程序会产生人类可读的输出。结果会打印标题。对人类有用,但对程序来说很糟糕。

$ ag 'filter\('
tests/string_lookup/tests.py
75:        self.assertSequenceEqual(Article.objects.filter(submitted_from__contains='192.0.2'), [a])
77:        self.assertEqual(Article.objects.filter(submitted_from__contains='32').count(), 0)

tests/test_runner/test_debug_sql.py
16:            Person.objects.filter(first_name='pass').count()
20:            Person.objects.filter(first_name='fail').count()

同一程序,通过管道传输到其他程序,输出:

$ ag 'filter\(' | cat
tests/string_lookup/tests.py:75:        self.assertSequenceEqual(Article.objects.filter(submitted_from__contains='192.0.2'), [a])
tests/string_lookup/tests.py:77:        self.assertEqual(Article.objects.filter(submitted_from__contains='32').count(), 0)
tests/test_runner/test_debug_sql.py:16:            Person.objects.filter(first_name='pass').count()
tests/test_runner/test_debug_sql.py:20:            Person.objects.filter(first_name='fail').count()

该输出更适合其他程序使用,因此我认为它ag知道它正在被管道传输。

如何ag知道它的输出被发送到哪里?

答案1

程序调用isatty()stdout 文件描述符(即1)。如果函数返回 true,则输出连接到 tty 设备(终端)。

相关内容