我正在使用 FFmpeg 处理一些 Haskell 项目.我需要使用 MP4 从媒体文件夹批量创建文件并从所有文件中创建屏幕截图。我得到了代码,并在 Unix 的终端上使用它。它可以工作,但是如何使它在一行中在 Haskell 的系统“xxxx”中执行?
如果不使用几个系统“xx”...
#/bin/sh
for i in $(ls *.mp4)
do
ffmpeg -i $i -vframes 7 -y -ss 10 -s 150x150 -an -sameq -f image2 -r 1/5 $i%1d.jpg
done
我试过了:
import System.Cmd
function = do{system "#/bin/sh";
system "for i in $(ls *.mp4)";
system "do";
system "ffmpeg -i $i -vframes 7 -y -ss 10 -s 150x150 -an -sameq -f image2 -r 1/5 $i%1d.jpg";
system "done";}
但它给出了一个错误:
-vframes: No such file or directory
/bin/sh: Syntax error: "done" unexpected
最佳答案
问题是您试图将脚本的每一行作为单独的、独立的 shell 调用来执行。您只需要一个 system
即可完成所有操作调用,并用 \n
分隔脚本的每一行:
system "for i in $(ls *.mp4)\ndo\n..."
但是您可以在一个逻辑行上编写 shell 命令,而不是:
system "for i in $(ls *.mp4); do ...; done"
使用
#!/bin/sh
时不需要第一行(顺便说一下,应该是 system
) .但是,如果您只是要执行单个 shell 脚本,我不确定您为什么要为此目的使用 Haskell。您应该在 Haskell 中编写目录内容的循环,并且只调用系统进行单独的转换。至少,你应该把这个脚本放到它自己的文件中,然后用
system "sh convert.sh"
调用它。或类似的。(如果您想在 Haskell 中为这些脚本之类的多行字符串提供更方便的语法,请尝试 interpolatedstring-perl6 或 string-qq 包。)
关于shell - #/bin/sh 一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8639879/