2017-09-12 6 views
2

System.IO.hIsTerminalDeviceを使用して、Handleが端末であるかどうかを判断し、この場合にはカラー化を適用します。私は、新しいプロセスstdinとstdoutのストリームとしてCreatePipeを使用してプロセスをforkすると、この関数がTrueを返すことに気付きました。これは間違った答えです。パイプはターミナルとみなすべきではありません。私はSystem.IOSystem.POSIX.IOソースコードを見て問題を追跡しようとしましたが、それはC pipeで終わり、私をどこにも導きません。ハンドルがHaskellのターミナルであるかどうかを確実に判断するには?

ハンドルが端末であるかどうかを判断する良い方法はありますか?または私は何か間違っているのですか?

import   Control.Monad 
import   System.IO 
import   System.Process 

main = do 
    (in_, Just out, Just err, h) <- createProcess $ (proc "./test2" []) 
            { std_in = CreatePipe 
            , std_err = CreatePipe 
            , std_out = CreatePipe } 
    dump out 
    where 
    dump h = forever $ do 
     ln <- hGetLine h 
     putStrLn ln 

次に `test2は:

import   System.IO 

main = do 
    print =<< hIsTerminalDevice stderr 
    print =<< hIsTerminalDevice stdout 
    print =<< hIsTerminalDevice stdin 

が続いて最初のプログラムを実行している:

更新

は、ここで私が観察された行動を公開することになっている2つのプログラムがあります

$ ./test 
False 
False 
False 

私は何が起こっているのか知っています:私はフォークしているのはプログラム自体ではなく、ドッカーコンテナです!そして、私は明示的に容器のttyを割り当てる-tパラメータを追加します...

答えて

3

問題を説明するための最小の例はありますか?

import System.Process 
import System.IO 

main = do (Just in_, Just out, err, h) <- 
      createProcess $ (shell "cat") { std_in = CreatePipe, 
              std_out = CreatePipe } 
      print =<< hIsTerminalDevice in_ 
      print =<< hIsTerminalDevice out 
+0

問題がcreateProcess' 'によって返されたハンドルではなくフォークプロセス_inside_ものではありません:CreatePipeで作成したハンドルは、端末装置と誤認ないあることを示唆している次のプログラムを印刷「偽」が2回、 。私が少し例を挙げて示唆しているように。 – insitu

+0

私はそれが私の実際の解決策につながる答えを受け入れる:) – insitu

関連する問題