我最近开始使用Haskell Turtle库来替换我的一些shell脚本.
有没有办法set -x在bash脚本中以某种方式启用内置Turtle命令(如cd)ala的回声?我发现在执行许多命令并且其中一个命令因异常而失败(如cp命令Exception:openBinaryFile: does not exist)时调试Turtle脚本是很有问题的.或者,您是否有一些建议如何快速隔离这些问题,以便我不必puStrLn/echo在整个脚本中插入命令?
我正在使用Haskell编写一个shell脚本,turtle并希望了解编写可能失败的命令的最佳实践.
现在我有一个案例表达式楼梯,如下所示:
runRemote :: MonadIO io => Text -> Text -> io ()
runRemote oldVersion' newVersion' = sh $ do
mkdir "out"
e1 <- shell ("command " <> oldVersion') empty
case e1 of
ExitFailure n -> cleanup
ExitSuccess -> do
e2 <- shell ("command " <> newVersion') empty
case e2 of
ExitFailure n -> cleanup
ExitSuccess -> do
curDir <- pwd
cd (curDir <.> oldVersion')
e3 <- shell ("command something else") empty
case e3 of
-- ...
-- …Run Code Online (Sandbox Code Playgroud) 使用Turtleshell脚本库我试图启动一个程序,即:
shell "vim" empty
Run Code Online (Sandbox Code Playgroud)
问题是这会产生警告Warning: Input is not from a terminal并导致Vim在最终启动之前滞后几秒钟.
问题:
shell从haskell启动外部程序是最好的Turtle函数吗?如何从Shell monad中提取一个值?
我想排序的命令列表点菜 bash的&&,但我也想提取最终ExitCode值.
说我有以下代码:
import Turtle
type Commands = [Shell ExitCode]
run :: (MonadIO io) => Commands -> io ExitCode
run cs = whatIsThisFunction $ Prelude.foldl (.&&.) (return ExitSuccess) cs
whatIsThisFunction :: (MonadIO io) => Shell a -> io a
whatIsThisFunction = undefined
Run Code Online (Sandbox Code Playgroud)
我试图看看我是否可以用Control.Foldl实现它,但没有找到解决方案.
有任何想法吗?
更一般地说,为什么Turtle没有提供具有这种签名的功能:
sh' :: MonadIO io => Shell a -> io a
Run Code Online (Sandbox Code Playgroud) 假设我想从一个文件流到另一个文件,但我想跳过输入文件的前n行.如果没有先使用'fold'折叠整个第一个文件,我该怎么做?
import Turtle
main = output "/tmp/b.txt" (f (input "/tmp/a.txt"))
Run Code Online (Sandbox Code Playgroud)
应该做什么才能实现这一目标?
ps:我没有足够的声誉来创建'haskell-turtle'标签.
我正在编写一个控制台应用程序,该应用程序需要提示用户几件事。我正在使用乌龟库。
我的函数如下所示:
askInput :: IO (Maybe Text)
askInput = do
echo "Input something: "
s <- readline
return s
Run Code Online (Sandbox Code Playgroud)
但echo在实施使用putStrLn,因此,将打印与尾随换行符的说法。
乌龟库中是否有一个类似于Python的输入函数raw_input,结合了提示和读取用户输入的功能?
如何将连接转换String为乌龟FilePath?例如,以下程序尝试读取一些文本文件,将它们连接成一个新文件并删除旧文件.虽然OverloadedStrings扩展已启用但它似乎不起作用:
{-# LANGUAGE OverloadedStrings #-}
module Main where
import System.Environment
import System.IO
import Control.Monad
import Turtle
import Turtle.Prelude
import qualified Control.Foldl as L
main :: IO ()
main = do
params <- getArgs
let n = read $ params !! 0
k = read $ params !! 1
-- Some magic is done here
-- After a while, read generated .txt files and concatenate them
files <- fold (find (suffix ".txt") ".") L.list
let …Run Code Online (Sandbox Code Playgroud) 考虑(inshell "echo A line of text." empty)有类型Shell Line。
问题:如何将这种类型的值转换为Text?
在用于从密钥环获取密码的Turtle脚本中,ssh-add使用这些密码调用以便不必手动填写它们,具有以下功能:
processKey :: (T.Text, T.Text) -> Shell Line -> IO ()
processKey (kn, str) pwds = do
-- Not sure why (text str) is needed here, but it won't typecheck without
-- it (despite OverloadedStrings).
let expectArg = do
ml <- grep (contains (text str)) pwds
let pass = getPwd $ cut tab (format l ml)
return $ T.unlines [ "<< EOF"
, "spawn ssh-add"
, "expect \"Enter passphrase\""
, "send " <> pass
, "expect eof"
, …Run Code Online (Sandbox Code Playgroud)