Well actually I also tried commons-exec but it's the same as
clojure.java.shell - they run system command directly, after execution
they return and terminate. That's not the way I want....

On Jan 13, 2:42 am, Denis Labaye <denis.lab...@gmail.com> wrote:
> Hi,
>
> In Java you would do it with common-exec:http://commons.apache.org/exec/
>
> So add the deps to your project.clj :
>
> :dependencies [[org.apache.commons/commons-exec "1.1"]]
>
> And use Clojure's Java interop.
>
> Keep us posted, I will need to do the same thing soon :)
>
> Denis
>
>
>
>
>
>
>
> On Wed, Jan 11, 2012 at 4:05 AM, jaime <xiejianm...@gmail.com> wrote:
> > I didn't read your code carefully yet but I think you're meaning to
> > copy streams between my Clojure code and the sub-process, actually
> > I've tried this but this is probably not what I want.
> > I might not make myself clear. So here I go again:
> >  1. I writing a program which will open an OS shell (that means "cmd"
> > under Windows and "bash" under Linux) as sub-process
> >  2. this "shell" thing will not terminate while my code is still
> > running, all system commands such as dir/ls/cat etc. will be thrown
> > into     the shell's input-stream to execute and the result is pulled
> > from shell's output-stream/err-stream
> >  3. because when the shell will finish its execution is
> > unpredictable, I chained an "echo stop-sign" command to original
> > command so that the program can get the sign when execution done. E.g.
> > for command "dir", I will throw "dir &echo stop-sign" to the shell,
> > when a stop-sign is captured then it knows the execution finished
> >  4. it works well so far but when the system command is interactive
> > one such as 'time' (in Windows), the program will hang; if there are
> > ways to know when to require user input then I can resolve this in the
> > code, but the answer is NO. I didn't find a way to detect this
> >  5. thus I tried to find out any workarounds but failed. I also tried
> > the way you mentioned here, it can work in an interactive way but in
> > this case I cannot get the control back.
>
> > That's all the things I'm struggling on...
>
> > On Jan 10, 4:54 pm, Alan Malloy <a...@malloys.org> wrote:
> > > On Jan 9, 9:24 pm, Phil Hagelberg <p...@hagelb.org> wrote:
>
> > > > jaime <xiejianm...@gmail.com> writes:
> > > > > Later on I tried to add code that can make this possible but I found
> > > > > there's no way to detect if a command requires user's input and thus
> > I
> > > > > have to find another way to make it work - but I didn't success and
> > > > > have been struggling for a workaround for a long while....
>
> > > > > anyone has any idea?
>
> > > > As far as I know this is impossible to do without bringing in
> > > > third-party libraries; this is just a (rather serious) shortcoming of
> > > > the JDK. I haven't looked into it enough to know which libraries would
> > > > offer it though.
>
> > > This should be possible if you don't mind suiciding your own process's
> > > stdin/stdout, by blindly forwarding all your input and output through
> > > the child. But if you send the child some input it didn't need, and it
> > > terminates, and then later you need your own stdin again, some pieces
> > > will be missing.
>
> > > I was going to attach a simple proof of concept to this, but I can't
> > > seem to get it right. So instead, here's what I was trying to do, and
> > > if someone wants to take it up this might be something useful to work
> > > from:
>
> > > (ns fork.core
> > >   (:require [clojure.java.io :as io])
> > >   (:import (java.io PipedReader PipedWriter))
> > >   (:gen-class))
>
> > > (defn -main [& args]
> > >   (println "Start typing, I'll cat it back atcha!")
> > >   (let [child (-> (Runtime/getRuntime) (.exec "/bin/cat"))
> > >         cin (.getInputStream child)
> > >         cout (.getOutputStream child)
>
> > >         in-pipe-in (PipedReader.)
> > >         in-pipe-out (PipedWriter. in-pipe-in)
>
> > >         out-pipe-in (PipedReader.)
> > >         out-pipe-out (PipedWriter. out-pipe-in)
>
> > >         in *in*, out *out*] ;; avoid dynamic-binding issues
> > >     (future (io/copy in in-pipe-out)) ;; read my stdin...
> > >     (future (io/copy in-pipe-in cout)) ;; write it to child's stdin
>
> > >     (future (io/copy cin out-pipe-out)) ;; read child's stdout...
> > >     @(future (io/copy out-pipe-in out)) ;; write it to my stdout, and
> > > wait for it to finish
> > >     (let [exit-code (.waitFor child)]
> > >       (println "Child process finished with exit code" exit-code)
> > >       exit-code)))
>
> > --
> > You received this message because you are subscribed to the Google
> > Groups "Clojure" group.
> > To post to this group, send email to clojure@googlegroups.com
> > Note that posts from new members are moderated - please be patient with
> > your first post.
> > To unsubscribe from this group, send email to
> > clojure+unsubscr...@googlegroups.com
> > For more options, visit this group at
> >http://groups.google.com/group/clojure?hl=en

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to