You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 17:15:04