System.IO.hIsTerminalDevice
を使用して、Handle
が端末であるかどうかを判断し、この場合にはカラー化を適用します。私は、新しいプロセスstdinとstdoutのストリームとしてCreatePipe
を使用してプロセスをforkすると、この関数がTrue
を返すことに気付きました。これは間違った答えです。パイプはターミナルとみなすべきではありません。私はSystem.IO
とSystem.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
パラメータを追加します...
問題がcreateProcess' 'によって返されたハンドルではなくフォークプロセス_inside_ものではありません:
CreatePipe
で作成したハンドルは、端末装置と誤認ないあることを示唆している次のプログラムを印刷「偽」が2回、 。私が少し例を挙げて示唆しているように。 – insitu私はそれが私の実際の解決策につながる答えを受け入れる:) – insitu