如何在bash脚本中编写命令行参数输入重定向?

时间:2013-09-03 11:02:29

标签: bash shell syntax ffmpeg

我正在整理一个bash脚本来运行电影渲染作业。 ffmpeg期望多行文本文件作为连接过滤到join several files的参数之一。像这样:

ffmpeg -f concat -i mylist.txt -c copy output

还有一个选项可以将它全部写在一行中,如下所示:

ffmpeg -f concat -i <(printf "file '%s'\n" A.mp4 B.mp4) -c copy Output.mp4

如何将后者写入bash脚本,用其他变量替换文件名?尝试拆分变量,但不是那个有效的变量。 $A$B变量包含输入文件的路径。

#!/bin/bash
...
TMP_LIST=$(printf "file '%s'\n" ${A} ${B})
APPEND="${FFMPEG} -f concat -i <<< {${TMP_LIST}} -c copy ${OUTPUT}"
# run the concatenation:
$APPEND

2 个答案:

答案 0 :(得分:3)

尝试以下方法:

ffmpeg -f concat -i <(printf "file '%s'\n" "$A" "$B") -c copy Output.mp4

答案 1 :(得分:2)

这是获取列表并在命令执行之前将命令存储在变量(数组)中的一种方法。不幸的是,进程替换只能通过将它们作为参数传递给函数来保持活动,所以我们必须在这里使用函数:

#!/bin/bash

LIST_IN_ARRAYS=("$A" "$B")  ## You can add more values.

function append {
    local APPEND=("$FFMPEG" -f concat -i "$1" -c copy "$2")  ## Store the command in an array.
    "${APPEND[@]}"  ## This will run the command.
}

append <(printf "file '%s'\n" "${LIST_IN_ARRAYS[@]}") "$OUTPUT"

虽然我会这样做,但事情更简单:

function append {
    "$FFMPEG" -f concat -i <(printf "file '%s'\n" "${@:2}") -c copy "$1"
}

append "$OUTPUT" "${LIST_IN_ARRAYS[@]}"  ## Or
append "$OUTPUT" "$A" "$B"