<br><font size=2 face="sans-serif">I probably should have also mentioned
that the &quot;fail&quot; on windows is for me ssh-ed to that box remotely,
where the sshd program is cygwin.</font>
<br>
<br>
<br>
<br>
<br>
<table width=100%>
<tr valign=top>
<td width=40%><font size=1 face="sans-serif"><b>Thomas Hartman &lt;thomas.hartman+external@db.com&gt;</b>
</font>
<br><font size=1 face="sans-serif">Sent by: haskell-cafe-bounces@haskell.org</font>
<p><font size=1 face="sans-serif">08/28/2007 06:03 PM</font>
<td width=59%>
<table width=100%>
<tr valign=top>
<td>
<div align=right><font size=1 face="sans-serif">To</font></div>
<td><font size=1 face="sans-serif">haskell-cafe@haskell.org</font>
<tr valign=top>
<td>
<div align=right><font size=1 face="sans-serif">cc</font></div>
<td>
<tr valign=top>
<td>
<div align=right><font size=1 face="sans-serif">Subject</font></div>
<td><font size=1 face="sans-serif">[Haskell-cafe] runInteractiveCommand
behaves differently on linux &nbsp; &nbsp; &nbsp; &nbsp;and windows</font></table>
<br>
<table>
<tr valign=top>
<td>
<td></table>
<br></table>
<br>
<br>
<br><font size=2 face="sans-serif"><br>
Maybe this is by design, but I just thought I would point this behavior
out and ask for comment.</font><font size=3> <br>
</font><font size=2 face="sans-serif"><br>
test1 merely shows that runInteractiveCommand reacts differently to perl
warnings than perl errors. Okay, maybe the inconsistency in that case is
due to perl and not haskell.</font><font size=3> <br>
</font><font size=2 face="sans-serif"><br>
test2 behaves the same on win and nix. This is &quot;pipe like&quot; in
that the ouptut of a command (which could be the result of a shell call,
but just as easily be the return of a haskell function) gets fed into a
shell command. In this case, if the shell command is simply &quot;tail&quot;
the behavior is consistent from win to nix.</font><font size=3> <br>
</font><font size=2 face="sans-serif"><br>
test3 shows that the behavior stops being consistent if ssh enters the
picture. (piping to tail via ssh). again, maybe this is due to ssh and
not haskell.</font><font size=3> <br>
</font><font size=2 face="sans-serif"><br>
however... note however that on windows</font><font size=3> <br>
</font><font size=2 face="Courier New"><br>
ghc -e 'mapM_ ( putStrLn . show ) [1..1000] ' | ssh `whoami`@localhost
'tail -n2'</font><font size=3> <br>
</font><font size=2 face="sans-serif"><br>
works fine. &nbsp;so it's not *just* ssh, but ssh in conjuction with runInteractiveCommand
which seems to cause problems</font><font size=3> <br>
</font><font size=2 face="sans-serif"><br>
FWIW, using 10 lines instead of 1000 still hangs on windows.</font><font size=3>
<br>
</font><font size=2 face="sans-serif"><br>
Is there a way to code up shell pipelike behavior in a more portable way?</font><font size=3>
<br>
</font><font size=2 face="Courier New"><br>
curious what the cafe thinks...</font><font size=3> <br>
</font><font size=2 face="Courier New"><br>
thomas.</font><font size=3> <br>
</font><font size=2 face="Courier New"><br>
import Test.HUnit</font><font size=3> </font><font size=2 face="Courier New"><br>
import Misc ( (&gt;&gt;=^) )</font><font size=3> </font><font size=2 face="Courier New"><br>
import System.Process</font><font size=3> </font><font size=2 face="Courier New"><br>
import System.IO</font><font size=3> </font><font size=2 face="Courier New"><br>
import System.Exit</font><font size=3> <br>
</font><font size=2 face="Courier New"><br>
-- works on linux, error on windows</font><font size=3> <br>
</font><font size=2 face="Courier New"><br>
test1 = do <br>
 &nbsp;res1 &lt;- test_shellrunStderrOk</font><font size=3> </font><font size=2 face="Courier New"><br>
 &nbsp;runTestTT $ TestCase ( assertEqual &quot;test1&quot; &quot;made
it&quot; &nbsp;res1 )</font><font size=3> </font><font size=2 face="Courier New"><br>
 &nbsp;where test_shellrunStderrOk = do</font><font size=3> </font><font size=2 face="Courier New"><br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;runprocessStdErrAllowed' &quot;&quot;
cmdPerlwarn</font><font size=3> </font><font size=2 face="Courier New"><br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return &quot;made it&quot;</font><font size=3>
</font><font size=2 face="Courier New"><br>
 &nbsp; &nbsp; &nbsp; &nbsp;cmdPerldie = &nbsp;&quot; perl -e 'die \&quot;error\&quot;'
&quot;</font><font size=3> </font><font size=2 face="Courier New"><br>
 &nbsp; &nbsp; &nbsp; &nbsp;cmdPerlwarn = &quot; perl -e 'warn \&quot;blee\&quot;'
&quot;</font><font size=3> <br>
</font><font size=2 face="Courier New"><br>
-- works on linux, windows</font><font size=3> </font><font size=2 face="Courier New"><br>
test2 = pipeTo &quot;tail -n2&quot;</font><font size=3> <br>
</font><font size=2 face="Courier New"><br>
-- works on linux, hangs on windows</font><font size=3> </font><font size=2 face="Courier New"><br>
test3 = pipeTo &quot;ssh `whoami`@localhost 'tail -n2'&quot;</font><font size=3>
<br>
</font><font size=2 face="Courier New"><br>
pipeTo cmd = do</font><font size=3> </font><font size=2 face="Courier New"><br>
 &nbsp;res2 &lt;- test_shellrunPipeinLike</font><font size=3> </font><font size=2 face="Courier New"><br>
 &nbsp;runTestTT $ TestCase ( assertEqual ( &quot;pipe to, cmd: &quot;
++ cmd) (show l) res2 )</font><font size=3> </font><font size=2 face="Courier New"><br>
 &nbsp;where test_shellrunPipeinLike = do</font><font size=3> </font><font size=2 face="Courier New"><br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;runprocessStdErrAllowed' (unlines $
map show [1..l]) ( cmd )</font><font size=3> </font><font size=2 face="Courier New"><br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&gt;&gt;=^ filter (not . ( == '\n')
)</font><font size=3> </font><font size=2 face="Courier New"><br>
 &nbsp; &nbsp; &nbsp; &nbsp;l = 1000</font><font size=3> <br>
</font><font size=2 face="Courier New"><br>
runprocessStdErrAllowed' inp s = do</font><font size=3> </font><font size=2 face="Courier New"><br>
 &nbsp; &nbsp;(ih,oh,eh,pid) &lt;- runInteractiveCommand s</font><font size=3>
</font><font size=2 face="Courier New"><br>
 &nbsp; &nbsp;so &lt;- hGetContents oh</font><font size=3> </font><font size=2 face="Courier New"><br>
 &nbsp; &nbsp;se &lt;- hGetContents eh</font><font size=3> </font><font size=2 face="Courier New"><br>
 &nbsp; &nbsp;hPutStrLn ih inp</font><font size=3> </font><font size=2 face="Courier New"><br>
 &nbsp; &nbsp;hClose ih</font><font size=3> </font><font size=2 face="Courier New"><br>
 &nbsp; &nbsp;ex &lt;- waitForProcess pid</font><font size=3> </font><font size=2 face="Courier New"><br>
 &nbsp; &nbsp;case ex of</font><font size=3> </font><font size=2 face="Courier New"><br>
 &nbsp; &nbsp; &nbsp; &nbsp;ExitFailure e &nbsp; &nbsp; &nbsp;-&gt; fail
$ &quot;shell command &quot; ++ s ++ &quot;\nFailed with status: &quot;
++ show e</font><font size=3> </font><font size=2 face="Courier New"><br>
 &nbsp; &nbsp; &nbsp; &nbsp;_ &nbsp; | otherwise &nbsp; &nbsp; -&gt; return
so</font><font size=3> <br>
<br>
</font><font size=2 face="sans-serif"><br>
---</font><font size=3><br>
</font><font size=2 face="sans-serif"><br>
This e-mail may contain confidential and/or privileged information. If
you <br>
are not the intended recipient (or have received this e-mail in error)
<br>
please notify the sender immediately and destroy this e-mail. Any <br>
unauthorized copying, disclosure or distribution of the material in this
<br>
e-mail is strictly forbidden.</font><tt><font size=2>_______________________________________________<br>
Haskell-Cafe mailing list<br>
Haskell-Cafe@haskell.org<br>
http://www.haskell.org/mailman/listinfo/haskell-cafe<br>
</font></tt>
<br>
<br>
<span style="font-family:sans-serif,helvetica; font-size:10pt; color:#000000">---</span><br>
<br>
<span style="font-family:sans-serif,helvetica; font-size:10pt; color:#000000">This e-mail may contain confidential and/or privileged information. If you </span><br>
<span style="font-family:sans-serif,helvetica; font-size:10pt; color:#000000">are not the intended recipient (or have received this e-mail in error) </span><br>
<span style="font-family:sans-serif,helvetica; font-size:10pt; color:#000000">please notify the sender immediately and destroy this e-mail. Any </span><br>
<span style="font-family:sans-serif,helvetica; font-size:10pt; color:#000000">unauthorized copying, disclosure or distribution of the material in this </span><br>
<span style="font-family:sans-serif,helvetica; font-size:10pt; color:#000000">e-mail is strictly forbidden.</span><br>