如何在Shake中分配PTY以运行交互式命令?
Shake默认的command_函数会将子进程的标准输入、输出、错误流重定向到内部管道,而vim这类交互式程序需要直接和当前终端交互,依赖终端属性控制,因此无法正常运行。你可以选择以下任意一种方案实现需求:
方案1:使用System.Process的callProcess(推荐,无额外依赖)
直接调用base库中默认继承当前进程标准流的进程调用函数,适配绝大多数在终端直接执行shake脚本的场景:
#!/usr/bin/env stack {- stack script --resolver lts-18.8 --ghc-options -Wall -} import Development.Shake import Control.Monad.IO.Class (liftIO) import System.Process (callProcess) main :: IO () main = shakeArgs shakeOptions $ do phony "cfg" $ do liftIO $ callProcess "vim" []
方案2:使用Shake内置command添加流继承参数
如果需要使用Shake command系列的其他特性(比如自定义工作目录、环境变量),可以添加继承标准流的参数:
#!/usr/bin/env stack {- stack script --resolver lts-18.8 --ghc-options -Wall -} import Development.Shake main :: IO () main = shakeArgs shakeOptions $ do phony "cfg" $ do command_ [InheritStdin, InheritStdout, InheritStderr] "vim" []
方案3:显式分配PTY(适配无终端上下文场景)
如果你需要在没有连接交互终端的场景(比如CI流水线、后台运行)运行要求PTY的程序,可以引入pty依赖手动分配伪终端:
#!/usr/bin/env stack {- stack script --resolver lts-18.8 --ghc-options -Wall --extra-deps: pty-0.0.3 -} import Development.Shake import Control.Monad.IO.Class (liftIO) import System.Posix.Pty (spawnWithPty) main :: IO () main = shakeArgs shakeOptions $ do phony "cfg" $ do liftIO $ spawnWithPty Nothing True "vim" [] (80, 24) -- 按需添加PTY输入输出转发逻辑
内容的提问来源于stack exchange,提问作者carbolymer
相关产品推荐
相关产品推荐

