Haskell海龟脚本:如何消费Shell
Haskell Turtle Script: How to consume Shell
import Turtle
import Prelude hiding (FilePath)
import Data.Text hiding (find)
main = do
f <- view $ format fp <$> find (suffix ".mp4") "/Users/me/videos"
procs "ffmpeg" ["-vn","-acodec","libmp3lame","-ac","2","-ab","160k","-ar","48000","-i"] empty
基本上我想将所有视频文件名提供给 ffmpeg。
两个问题:
- 如何合并
procs
和 Shell
流?
- ffmpeg 接受两个输入:一个用于
-i
,一个用于输出文件名。用 Turtle 实现这个的最佳实践是什么?
我看到 foldIO 功能看起来很有前途。但是我不知道怎么用。
不要那样使用 view
。您将其用于 运行 a Shell
,它会打印结果值并使您无法访问它们。 Shell
本身是一个 monad,所以你应该建立一个 Shell
动作,然后 运行 与 view
或 sh
(丢弃值而不打印) . (它们是终端功能;只有在您完成正在做的事情时才使用它们)。事实上,MonadIO Shell
,所以你在 IO
中可以做的任何事情你都可以在 Shell
中做(通过 liftIO :: MonadIO m => IO a -> m a
)。
main = sh $ do -- You don't want to print the output of this Shell (a bunch of ()s)
filename <- format fp <$> find (suffix ".mp4") "/Users/me/videos"
let output = findOtherName filename -- Find the output arg for ffmpeg
procs "ffmpeg" ["-vn","-acodec","libmp3lame","-ac","2","-ab"
,"160k","-ar","48000","-i",filename,output ] -- Just add them on
这相当于
#!/bin/sh
for filename in /Users/me/videos/*.mp4; do
output="`findOtherName "$filename"`"
ffmpeg -vn -acodec libmp3lame -ac 2 -ab 160k -ar 48000 -i "$filename" "$output"
done
import Turtle
import Prelude hiding (FilePath)
import Data.Text hiding (find)
main = do
f <- view $ format fp <$> find (suffix ".mp4") "/Users/me/videos"
procs "ffmpeg" ["-vn","-acodec","libmp3lame","-ac","2","-ab","160k","-ar","48000","-i"] empty
基本上我想将所有视频文件名提供给 ffmpeg。 两个问题:
- 如何合并
procs
和Shell
流? - ffmpeg 接受两个输入:一个用于
-i
,一个用于输出文件名。用 Turtle 实现这个的最佳实践是什么?
我看到 foldIO 功能看起来很有前途。但是我不知道怎么用。
不要那样使用 view
。您将其用于 运行 a Shell
,它会打印结果值并使您无法访问它们。 Shell
本身是一个 monad,所以你应该建立一个 Shell
动作,然后 运行 与 view
或 sh
(丢弃值而不打印) . (它们是终端功能;只有在您完成正在做的事情时才使用它们)。事实上,MonadIO Shell
,所以你在 IO
中可以做的任何事情你都可以在 Shell
中做(通过 liftIO :: MonadIO m => IO a -> m a
)。
main = sh $ do -- You don't want to print the output of this Shell (a bunch of ()s)
filename <- format fp <$> find (suffix ".mp4") "/Users/me/videos"
let output = findOtherName filename -- Find the output arg for ffmpeg
procs "ffmpeg" ["-vn","-acodec","libmp3lame","-ac","2","-ab"
,"160k","-ar","48000","-i",filename,output ] -- Just add them on
这相当于
#!/bin/sh
for filename in /Users/me/videos/*.mp4; do
output="`findOtherName "$filename"`"
ffmpeg -vn -acodec libmp3lame -ac 2 -ab 160k -ar 48000 -i "$filename" "$output"
done