If you're using Bash or some other unix-y shell which supports it, you can produce the same effect with built-in syntax:
https://unix.stackexchange.com/a/64011 In Bash, you can use the command1 <( command0 ) redirection syntax, which > redirects command0's stdout and passes it to a command1 that takes a > filename as a command-line argument. This is called *process substitution* > <https://en.wikipedia.org/wiki/Process_substitution>. > Mike. On Saturday, February 10, 2018 at 12:57:52 PM UTC, Or Rikon wrote: > > I actually fixed this a couple of days ago (see here > <http://github.com/rikonor/stdio-wrapper>) without realizing what the > issue was, but now I understand! Thank you! > > On Fri, Feb 9, 2018 at 10:27 PM Matt Harden <matt....@gmail.com > <javascript:>> wrote: > >> You need to close fIn after the copy is done. As it is now, fIn.Close() >> happens after io.Copy(os.Stdout, buf), which completes after your cat >> command finishes. But cat won't finish until its input pipe returns EOF, >> which happens after fIn.Close(). >> >> On Wed, Feb 7, 2018 at 5:46 PM Or Rikon <rik...@gmail.com <javascript:>> >> wrote: >> >>> Hi! >>> >>> I asked this previously on Stack Overflow but so far have not received a >>> response, so I figured I will try here as well. >>> >>> I'm trying to wrap an executable that takes an input and output file >>> paths as arguments, such that it will be possible to provide the input and >>> output as stdin and stdout. >>> >>> I've written a short script in Go that attempts to do this, but for some >>> reason which eludes me, it hangs forever. >>> >>> >>> Here is the script: >>> >>> >>> package main >>> import ( >>> "bytes" >>> "io" >>> "log" >>> "os" >>> "strings" >>> "syscall" >>> >>> "golang.org/x/sync/errgroup") >>> /* >>> Expected behavior: >>> >>> # Terminal 1 >>> $ go run main.go >>> >>> # Terminal 2 >>> $ cat inPipe > outPipe >>> >>> The go program is writing to inPipe and reading from outPipe >>> >>> Actual behavior: The program stalls >>> */ >>> >>> func main() { >>> eg := &errgroup.Group{} >>> >>> inPipe := "inPipe" >>> outPipe := "outPipe" >>> >>> if err := syscall.Mkfifo(inPipe, 0644); err != nil { >>> log.Fatal(err) >>> } >>> defer os.Remove(inPipe) >>> >>> if err := syscall.Mkfifo(outPipe, 0644); err != nil { >>> log.Fatal(err) >>> } >>> defer os.Remove(outPipe) >>> >>> fIn, err := os.OpenFile(inPipe, os.O_WRONLY, os.ModeNamedPipe) >>> if err != nil { >>> log.Fatal(err) >>> } >>> defer fIn.Close() >>> >>> eg.Go(func() error { >>> _, err := io.Copy(fIn, strings.NewReader("123")) >>> return err >>> }) >>> >>> fOut, err := os.OpenFile(outPipe, os.O_RDONLY, os.ModeNamedPipe) >>> if err != nil { >>> log.Fatal(err) >>> } >>> defer fOut.Close() >>> >>> buf := &bytes.Buffer{} >>> >>> eg.Go(func() error { >>> _, err := io.Copy(buf, fOut) >>> return err >>> }) >>> >>> if err := eg.Wait(); err != nil { >>> log.Fatal(err) >>> } >>> >>> if _, err := io.Copy(os.Stdout, buf); err != nil { >>> log.Fatal(err) >>> }} >>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "golang-nuts" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to golang-nuts...@googlegroups.com <javascript:>. >>> For more options, visit https://groups.google.com/d/optout. >>> >> -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.