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

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

所以我正在编写这个小 nautilus 脚本,用于将视频转码为 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 ]

似乎没有被触发。这是为什么?是&&错了还是别的什么?

答案1

达到该语句的唯一方法是该语句exec本身失败;如果成功,该ffmpeg命令将完全替换 shell。 (迂腐地,&&在这种情况下也会失败,因此根本无法到达。)您不想exec这样做,只需运行它即可。

答案2

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

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

$ 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.
    [...]

答案3

根据这个 exec将 shell 替换为您指定的命令。所以你的脚本永远不会到达exec.

你不需要exec。只需指定命令即可。

答案4

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

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

相关内容