이 bash 스크립트에서 명령의 종료 값을 얻을 수 없는 이유는 무엇입니까?

이 bash 스크립트에서 명령의 종료 값을 얻을 수 없는 이유는 무엇입니까?

그래서 저는 비디오를 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명령이 셸을 완전히 교체합니다. (현학적으로 &&이 경우에도 실패하므로 전혀 도달하지 못할 것입니다.) exec이 작업을 수행하고 싶지 않고 그냥 실행하십시오.

답변2

exec command명령문은 현재 쉘을 로 대체합니다 command. 즉, 스크립트는 실제로 라인에서 종료됩니다 . 이는 해당 명령이 PATH에 없거나 다른 이유로 시작할 수 없는 exec ffmpeg ...경우에만 발생합니다 .ffmpeg

bash 명령 프롬프트에 다음을 입력하면 execbash 내장 기능에 대한 자세한 내용을 얻을 수 있습니다.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쉘을 지정한 명령으로 바꾸십시오. 따라서 귀하의 스크립트는 결코 도착하지 않습니다 exec.

당신은 필요하지 않습니다 exec. 명령을 지정하면 됩니다.

답변4

exec명령을 서브셸에 넣으면 명령을 보존할 수 있습니다.

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

관련 정보