首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash脚本:无法执行mencoder命令!

Bash脚本:无法执行mencoder命令!
EN

Stack Overflow用户
提问于 2011-04-21 12:25:29
回答 5查看 639关注 0票数 0

这是一个脚本..我只想练习一些击球技巧,并为我的中文mp4播放器做一个快速使用=)

代码语言:javascript
复制
#!/bin/bash

#####################################
# RockChip 4gb Player mencoder preset
#####################################

TOOL='mencoder'
OUTS='./out/'
OPT1='-noodml'
OPT2="-of avi -ofps 22 -vf-add scale=320:-2,expand=320:240 -srate 44100 -ovc xvid -xvidencopts bitrate=400:max_bframes=0:quant_type=s16le -oac lavc -lavcopts acodec=mp2:abitrate=128"

bold=`tput bold`
normal=`tput sgr0`

# check does argument exists
if test -z "$1"; then
  echo "There's no file given =)"
fi

# Check is it dir or file

if [ -d $1 ]; then
  echo "Directory is given: $1"

  # Test if output argument is given
  if [ -z $2 ]; then
        echo "No output argument given using default: ${bold}${red}$OUTS${normal}"
        mkdir out
  else
      # test is given path a directory
        if [ -d $2 ]; then
                OUT="$2"
        else
           echo "Output argument is not a directory"
        fi
   fi

OLD_IFS=IFS; IFS=$'\n'

for file in `find . -name "*.*" -type f | sed 's!.*/!!'` ; do
        file=`printf "%q" "$file"`
echo    ${TOOL} ${OPT1} ${file} -o ${OUTS}${file} ${OPT2}
done

IFS=OLD_IFS

fi

问题是这一行:

代码语言:javascript
复制
echo    ${TOOL} ${OPT1} ${file} -o ${OUTS}${file} ${OPT2}

当您删除echo来执行命令时,命令会失败,但是如果您复制这个echo脚本,并手动执行它,一切都会正常工作。

从shell脚本执行命令时,输出为:

代码语言:javascript
复制
MEncoder 1.0rc4-4.2.1 (C) 2000-2010 MPlayer Team
158 audio & 340 video codecs
-of avi -ofps 22 -vf-add scale=320:-2,expand=320:240 -srate 44100 -ovc xvid -xvidencopts bitrate=400:max_bframes=0:quant_type=s16le -oac lavc -lavcopts acodec=mp2:abitrate=128 is not an MEncoder option

Exiting... (error parsing command line)

正如我在手动执行命令之前提到的,每件事都是正常工作的,例如:

代码语言:javascript
复制
mencoder -noodml 12\ I\ Love\ You\ 1\ \ I\ Love\ You\ 2\ \ I\ Love\ You\ 3.avi -o ./out/12\ I\ Love\ You\ 1\ \ I\ Love\ You\ 2\ \ I\ Love\ You\ 3.avi -of avi -ofps 22 -vf-add scale=320:-2,expand=320:240 -srate 44100 -ovc xvid -xvidencopts bitrate=400:max_bframes=0:quant_type=s16le -oac lavc -lavcopts acodec=mp2:abitrate=128

现在我所能做的就是复制粘贴生成的命令..问题出在哪里?我很努力地在谷歌上搜索..没有结果。(我知道mencoder有个人资料..这不是我想要的情况)

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-04-21 12:54:05

for循环之前有这样一条语句:

代码语言:javascript
复制
IFS=$'\n'

这会将您的内部字段分隔符设置为换行符,而不是默认的匹配任何空格。这改变了被替换的参数的解析方式。在构造命令的行中:

代码语言:javascript
复制
${TOOL} ${OPT1} ${file} -o ${OUTS}${file} ${OPT2}

接下来会发生的是,这些${variable}表达式中的每一个都将被展开,然后shell将尝试在\n上拆分它们,而不是像您通常预期的那样拆分在空格上。它将给出与以下类似的结果(除非其中一个变量包含换行符):

代码语言:javascript
复制
"${TOOL}" "${OPT1}" "${file}" -o "${OUTS}${file}" "${OPT2}"

在这里,您可以看到您将整个${OPT2}字符串作为单个参数传递,而不是允许Bash将其拆分为空格并分别传递每个标志。然后mencoder被这个巨大的参数搞糊涂了,它不知道如何处理这个参数。当然,由于空格仍然存在,它们将由echo命令打印出来,并且在没有重置$IFS的shell中可以很好地工作。

您可以很容易地演示此效果,方法是定义一个简单的函数,该函数将在单独的行上打印每个参数:

代码语言:javascript
复制
$ print_args() { for arg; do echo $arg; done }
$ foo="1 2"
$ print_args ${foo} ${foo}
1
2
1
2
$ IFS=$'\n'
$ print_args ${foo} ${foo}
1 2
1 2

我建议不要对for循环使用$IFS技巧。相反,您可以使用while read file遍历输入中的每一行。我还建议不要使用printf "%q"来转义空格,而是将参数引用到mencoder,它会将整个过程作为一个参数传递进来。请注意,我引用${file}${OUTS}${file}是为了确保它们都是作为单个参数传入的,而不是引用${OPT1}${OPT2}以允许外壳将它们解析为单独的参数。

代码语言:javascript
复制
find . -name "*.*" -type f | sed 's!.*/!!' | while read -r file
do 
    "${TOOL}" ${OPT1} "${file}" -o "${OUTS}${file}" ${OPT2}
done

顺便说一句,我建议您使用$()而不是``进行命令替换;many reasons为什么更可取,比如可读性、更合理的引号和转义规则,以及嵌套多级命令替换的能力。Jonathan和Wes指出的问题值得注意,尽管它们不是直接导致您的问题的原因。

票数 0
EN

Stack Overflow用户

发布于 2011-04-21 12:35:47

你有(我相信是第37行):

代码语言:javascript
复制
OUT="$2"

但我想你的意思是:

代码语言:javascript
复制
OUTS="$2"
票数 1
EN

Stack Overflow用户

发布于 2011-04-21 12:45:44

我不完全确定,但也许用双引号(")引用文件名比使用printf "%q" "$file"更好。

因此,请替换:

代码语言:javascript
复制
file=`printf "%q" "$file"`
${TOOL} ${OPT1} ${file} -o ${OUTS}${file} ${OPT2}

使用

代码语言:javascript
复制
${TOOL} ${OPT1} "${file}" -o "${OUTS}${file}" ${OPT2}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5739487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档