shell - #/bin/sh 一行

标签 shell unix haskell ffmpeg

我正在使用 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-perl6string-qq 包。)

关于shell - #/bin/sh 一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8639879/

相关文章:

mysql - 重启后如何让 Shell 脚本继续运行?

linux - 为什么 more 命令无法读取标准输入,而是从管道标准输入读取?

haskell - 并行树搜索

linux - 如何使用 sed 提取子字符串

python - 在我的 Raspberry Pi 上找到闪存驱动器并执行给定程序的 Shell 文件

java - 用于获取 Java 进程的线程转储的 Shell 脚本

file - awk 检查文件是否存在

unix - zcat 无法正确解压缩文件

arrays - Haskell - 检查二维列表的行数是否与列数相同

haskell - 为给定的数据类型编写一个在镜头上具有多态性的函数?