I replied a bit too fast, I didn't realized you wanted to such an advanced
thing

It is probably more a JVM question than a Clojure question then.

On Fri, Jan 13, 2012 at 3:42 AM, jaime <xiejianm...@gmail.com> wrote:

> 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
>

-- 
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