Haskell Turtle脚本:如何使用Shell

时间:2017-10-10 11:57:41

标签: haskell haskell-turtle

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。 两个问题:

  1. 如何将procsShell个流相结合?
  2. ffmpeg有两个输入:一个用于-i,另一个用于输出文件名。使用Turtle实现此目的的最佳做法是什么?
  3. 我见过看起来很有前途的foldIO函数。但我无法弄清楚如何使用它。

1 个答案:

答案 0 :(得分:2)

不要那样使用view。您使用它来运行一个Shell,它会打印结果值并使您无法访问它们。 Shell本身是一个monad,因此您应该构建一个Shell操作,然后使用viewsh运行(在不打印的情况下丢弃值)。 (它们是终端功能;只有当你完成你正在做的事情时才使用它们)。事实上,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

这与

相当
verticalCollectionView.register(UINib(nibName: "OfferHeaderCell", bundle: nil), forSupplementaryViewOfKind:UICollectionElementKindSectionHeader, withReuseIdentifier: "OfferHeaderCell")
verticalCollectionView.register(UINib(nibName: "APRHeaderCell", bundle: nil), forSupplementaryViewOfKind:UICollectionElementKindSectionHeader, withReuseIdentifier: "APRHeaderCell")