欺骗程序认为它们没有通过管道传送的一般方法是什么?

欺骗程序认为它们没有通过管道传送的一般方法是什么?

许多 CLI 程序在打印到控制台时会产生不同的输出,而不是通过管道传输到另一个程序。例如,exa将打印带有颜色突出显示的文件列表。但exa | less不会有颜色。

我知道这些程序通常具有强制一种输入或另一种输入的参数,因此解决方法是学习这些参数并在管道时使用它们。由于存在以下几个问题,这不是通用解决方案:

  • 您必须学习每个命令的参数,或者当您只是尝试通过管道传输某些内容时,您必须不断从工作流程中分心去阅读联机帮助页。
  • 并非所有程序都提供此类参数。
  • 必须不断地将参数插入一长串管道中是很烦人的。有时,整个链需要很长时间才能运行,因此当您看到不正确的输出并意识到您忘记添加--color或再次执行其他操作时,您已经浪费了几分钟的时间。

显然,该程序的设计是它会检测到正在通过管道传输并猜测不同的输出是合适的,这在许多情况下是良好且正确的行为。在许多其他情况下,程序的猜测是错误的。不必学习每个程序的独特接口并覆盖猜测,如果您可以通过不首先告诉程序它正在通过管道传输来预先阻止猜测,那么似乎会更有效。

这可能吗?什么是管道输出程序的通用方法,同时使程序认为它正在打印到控制台并产生与没有管道时相同的输出?


如果答案取决于 shell,我对以下 shell 感兴趣:

  • bash因为它是事实上的标准
  • zsh因为它是通用bash兼容的升级
  • fishbash因为这是一个尝试在不兼容的情况下进行改进的示例

基于https://askubuntu.com/a/482826问题似乎是isatty当程序通过管道传输时这是错误的。因此,解决方案可能是以某种方式通过管道传递命令,但isatty仍然为真。不过,我不知道如何才能真正实现这一目标。

答案1

不确定这是否是一个好的解决方案,但基于https://stackoverflow.com/questions/4233808/piping-data-to-linux-program-which-expects-a-tty-terminal似乎unbuffer实现了这一点。

unbuffer exa | less会显示颜色。

相关内容