【问题标题】:How to pipe stdout from one command into a clean terminal view?如何将标准输出从一个命令传送到干净的终端视图?
【发布时间】:2020-07-20 17:52:20
【问题描述】:

目前正在编写一个 CLI 应用程序,它为某些 Git 功能提供了更好的包装器。由于这是一个 CLI,因此用户使用他们的终端来使用该应用程序。

我需要做的是将某些命令的输出通过管道传输到“干净”的交互式子程序中。例如,如果用户打开了我的 UI,但按下了一个键,我需要我的 UI 与 git add --patch [file_name] 的 UI 完全交换。当用户完成后(因为这是一个最终结束的逐步过程),我需要切换回我的应用程序的 UI。

问题是,我不知道将这个输出传送到哪里或什么地方。如果我将它通过管道传输到终端,它会与现有 CLI 应用程序的 stdout 冲突,并且不起作用。

一个单独但相关的功能是显示差异日志。为了解决这个干净和交互式终端的问题,我将stdout 输入less 并且效果很好。只是找不到像git add --patch 这样更复杂的东西的方法。

如果需要更多详细信息,请告诉我。上次当我添加(显然太多)信息时,Mods 变得脾气暴躁,所以这是超级减少的。

【问题讨论】:

  • 你需要创建一个伪终端(PTY)。
  • 好的,以前从未听说过。谢谢。有没有一些标准的方法可以做到这一点,还是你通常必须自己动手?找不到很多初学者级别的文档,但可能是我的错。不过我会努力的,感谢指针。
  • POSIX 兼容系统有一个标准方法。这是一个非常通用的功能。 devblogs.microsoft.com/commandline/…stackoverflow.com/questions/21545897/… 用于 Windows。维基上的文章:en.wikipedia.org/wiki/Pseudoterminal。 Unix 手册:man7.org/linux/man-pages/man7/pty.7.html大量可用文档!
  • 好吧,这完全超出了我的想象。我以为只有一些简单且跨平台的东西,我可以将一个命令输入并让一切正常。显然情况并非如此。不过感谢您的帮助。
  • 这就是如何正确实现它。但是你看,即使是微软也意识到他们需要一个功能。 :-)

标签: terminal


【解决方案1】:

使用寻呼机

大多数具有多屏输出的 git 命令会自动调用用户配置的 pager,例如 lessmore

对于那些不这样做的人,您可以将它们显式传递给less。 Less 的默认行为是在终端退出时恢复终端。

git add --patch [file_name] 2>&1 | less

使用诅咒

使用curses在启动时清除屏幕并在关闭时恢复它。例如,在 Python 中:

import curses

# Clear the screen.
scr = curses.initscr()
scr.clear()
scr.refresh()

# Application code here.
import time
time.sleep(1)

# Restore the screen.
curses.endwin()

(如果您不使用 Python,您可能会在您使用的任何语言中找到本机 curses 绑定。)

【讨论】:

  • 我会调查 Curses,谢谢。使用 Rust,但我知道有某种 Curses 支持。您显示的第一个命令只是锁定了我的终端,可能与我的终端在本地有关,但我绝对无法从中得到任何东西。黑屏,无路可逃。必须关闭整个窗口。
  • 仅仅使用诅咒是不够的。您仍然需要一个控制终端和一个伪终端,以允许另一个交互式程序按原样工作。
猜你喜欢
  • 2015-06-01
  • 1970-01-01
  • 2013-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-08
  • 1970-01-01
相关资源
最近更新 更多