That's a really nice trick. Thanks for sharing.

On Sunday, February 11, 2018 at 3:48:09 AM UTC-5, Michael Houston wrote:
>
> 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> 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> 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.
>>>> 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.

Reply via email to