0

编辑我已经分离了我的循环,所以我不会遇到一些奇怪的嵌入式循环垃圾,并且仍然会遇到段错误。我在下面更新了我的代码块。不幸的是,添加回声不再起作用,所以我永远无法做到“我做到了!” 回显命令。

我有一个 shell 脚本,它从脚本的参数中获取文件,将它们分成视频和图像序列,然后将它们添加到列表中。该列表稍后将传递给 ffmpeg 进行批量编码。奇怪的是,我设置的循环会给出“Segmentation Fault 11”,除非我在循环的开头添加一个 echo 语句。一探究竟:

## Build list of files to encode, using only files from approved extensions list.
argument_files=()
filelist=()

echo "Building file list."
for argument in $@; do
    OLDIFS=$IFS
    IFS=$'\n'
    argument_files+=($(find "$argument" -type f | grep -e ".*/.*\.\($filters)"))
    IFS=$OLDIFS
done

for thisfile in $argument_files; do
    echo $thisfile
    if [[ "$thisfile" =~ .*\.($sequence_exts) ]]; then
        has_sequences="y"
        inlist="n"
        tempdir=$(dirname "$thisfile")
        tempext=$(basename "$thisfile" | sed 's/.*\.\(.*\)/\1/')
        tempname=$(basename "$thisfile" | sed 's/\(.*\)\..*/\1/')
        collection=$(echo "$tempname" | sed 's/[0-9]*$//')
        chartemp=$(echo "$tempname" | grep -o -m 1 -e '[0-9]*$')

        if [[ "$chartemp" != [0-9]* ]]; then
            continue
        fi

        charcount=`printf "%02d" ${#chartemp}`
        new_path="${tempdir}/${collection}%${charcount}d.${tempext}"

        for e in ${filelist[@]}; do
            if [[ "$e" == "$new_path" ]]; then
                inlist="y"
                break
            fi
        done

        if [[ "$inlist" == "n" ]]; then
            OLDIFS=$IFS
            IFS=$'\n'
            filelist+=("$new_path")
            IFS=$OLDIFS
        fi

    elif [[ "$thisfile" =~ .*\.($mov_exts) ]]; then
        OLDIFS=$IFS
        IFS=$'\n'
        filelist+=("$thisfile")
        IFS=$OLDIFS
    fi
done

echo "I made it!"

顺便说一下,第一个 if 语句用于过滤掉图像序列,并将它们转换为 ffmpeg 想要名称%0Nd.jpg 的格式。它还尝试确保尚未将相同的图像序列添加到批处理列表中。这对我来说真的很hacky。如果是,请道歉。

4

1 回答 1

0

如果zsh抛出段错误,则表明 zsh 本身存在严重问题(尽管内存错误导致段错误的可能性很小)。

您可能需要检查zsh更新。或者寻找替代品(可能是 pdksh 或 bash)。

任何脚本错误都不应该导致 shell 出现段错误。

于 2013-09-15T07:26:55.603 回答