为什么无法在此bash脚本中获得命令的退出值?


9

因此,我正在编写此鹦鹉螺脚本,用于将视频转码为mp3:

#! /bin/bash -x

if [ -z "$1" ]
    then
    zenity --warning --text="Error - No file selected !"
    exit 1
fi

BASEFILENAME=${1%.*}

exec ffmpeg -i "$1" -ab 256k "$BASEFILENAME.mp3" &&

if [ "$?" -eq 0 ]
    then
    zenity --info --text="Converting successful"
    exit
fi

问题是,尽管ffmpeg命令成功执行了 if [ "$?" -eq 0 ]

似乎没有被触发。这是为什么?是&&错误的还是其他东西?

Answers:


13

只能通过exec自身失败来到达该语句。如果成功,该ffmpeg命令将完全替换外壳。(&&通常,在这种情况下,遗嘱也会失败,因此根本无法实现。)您不想这样做exec,只需运行它即可。


我知道,没有&&ffmpeg命令之后,它实际上就可以工作。我还有一个问题,在这个地方是否还可以-有没有一种方法可以在不使用终端窗口的情况下显示ffmpeg的stdout和stderr?就像在zenity fe中一样
tesseract

您想将其与$()结构一起捕获到一个变量中,然后将该变量传递给zenity。当心报价,并zenity在我的经验,使用PanGo公司,所以你需要更换<&>&lt;&amp;&gt;分别。
geekosaur 2011年

5

exec command语句用替换当前的shell command。就是说,您的脚本实际上终止于第exec ffmpeg ...;当且仅当ffmpeg在您的PATH上找不到该命令(或者由于其他原因而无法启动该命令)时,才会执行剩余的行。

您可以exec通过help exec在bash命令提示符下键入来获取有关bash内置的更多详细信息:

$ help exec
exec: exec [-cl] [-a name] [command [arguments ...]] [redirection ...]
    Replace the shell with the given command.

    Execute COMMAND, replacing this shell with the specified program.
    ARGUMENTS become the arguments to COMMAND.  If COMMAND is not specified,
    any redirections take effect in the current shell.
    [...]

1

据此, exec用您指定的命令替换外壳。因此,您的脚本永远都无法访问过去的命令exec

您不需要exec。只需指定命令。


0

如果将exec命令放入子shell中,则可以保留该命令:

- exec ffmpeg -i "$1" -ab 256k "$BASEFILENAME.mp3" &&
+ (exec ffmpeg -i "$1" -ab 256k "$BASEFILENAME.mp3") &&

我知道了,但那还不是&&错吗?
tesseract

是。保留该标记有exec什么意义?
2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.