Рациональное поведение при передаче двух подпроцессов - PullRequest
0 голосов
/ 20 декабря 2018

У меня нестабильное поведение со следующим кодом

{-# LANGUAGE OverloadedStrings #-}

module Main where

import Control.Concurrent (threadDelay)
import qualified Control.Concurrent.Async      as Async
import qualified System.Process.Typed          as Proc
import qualified System.Process                as P
import qualified GHC.IO.Handle                 as H

main :: IO ()
main = do
  print "starting"

  (readEnd, writeEnd) <- P.createPipe

  let p1 = Proc.setStdout (Proc.useHandleClose writeEnd) "echo -n 'foo'"
  let p2 = Proc.setStdin (Proc.useHandleClose readEnd) "base64 -"

  Async.concurrently
    (threadDelay 1000 *> Proc.runProcess_ p2) -- with the delay, it works
    -- (Proc.runProcess_ p2) -- that line will make the program hang forever
    (Proc.runProcess_ p1)

  print "done"

Я хочу передать стандартный вывод из первого подпроцесса во второй подпроцесс.Я пытался использовать getStdout и setStdin, но у меня возникла проблема с проверкой типов:

Proc.withProcess_ "echo -n foo" $ \r1 -> do
  let p2 = Proc.setStdin (Proc.getStdout r1) "base64"


  • Couldn't match expected type ‘Proc.StreamSpec
                                    'Proc.STInput stdin0’
                with actual type ‘()’
  • In the first argument of ‘Proc.setStdin’, namely
      ‘(Proc.getStdout r1)’
    In the expression: Proc.setStdin (Proc.getStdout r1) "base64"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...