【问题标题】:How do I print a buffer to stdout piped through a pager?如何通过寻呼机将缓冲区打印到标准输出?
【发布时间】:2014-03-11 09:54:05
【问题描述】:

我有一个很大的缓冲区(缓冲区 [] 字节),我想将其打印到标准输出,但要通过传呼机(例如更少或更多)进行管道传输。有点像 man 命令。我不想先将缓冲区写入 tmp 文件或让用户手动将输出通过管道传输到命令行上的寻呼机。

我可以找到 examples 来了解如何将一个命令的输出通过管道传输到另一个命令,但没有从内部缓冲区开始。

有什么想法吗? 谢谢。

【问题讨论】:

    标签: go


    【解决方案1】:

    为了通过管道传送到寻呼机,您可以执行以下操作:

    package main
    
    import (
            "fmt"
            "io"
            "os"
            "os/exec"
    )
    
    func main() {
            // declare your pager
            cmd := exec.Command("less")
            // create a pipe (blocking)
            r, stdin := io.Pipe()
            // Set your i/o's
            cmd.Stdin = r
            cmd.Stdout = os.Stdout
            cmd.Stderr = os.Stderr
    
            // Create a blocking chan, Run the pager and unblock once it is finished
            c := make(chan struct{})
            go func() {
                    defer close(c)
                    cmd.Run()
            }()
    
            // Pass anything to your pipe
            fmt.Fprintf(stdin, "hello world\n")
    
            // Close stdin (result in pager to exit)
            stdin.Close()
    
            // Wait for the pager to be finished
            <-c
    }
    

    【讨论】:

    • 只是想知道你为什么不使用 cmd.Start()cmd.Wait() 来消除阻塞通道的需要?
    • 因为你只能有一个 cmd.Wait() 在那里你可以有 N &lt;-c。所以如果需要异地等待,最好不要依赖Wait。
    【解决方案2】:

    听起来您需要的是Encoder。您正在使用寻呼机的软件包吗?如果是这样,您可能想在包中查找编码器,或者如果没有提供,请创建自己的编码器。

    这是一个示例,说明如何使用 JSON 编码器来实现与您尝试做的类似的事情:

    b := []byte(`{ ... some json object ... }`)
    json_encoder := json.NewEncoder(os.Stdout)
    json_encoder.Encode(b)
    

    在此示例中,JSON 编码器接受 []byte 并执行所有工作以将其编码为 JSON 文档并写入提供的 io.writer。如果您正在使用一个包并且它不提供编码器,您可以通过查看JSON Encoder 源代码来创建自己的源代码来了解如何编写一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-17
      相关资源
      最近更新 更多