이 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 ]

트리거되지 않는 것 같습니다. 왜 그런 겁니까? 인가 &&잘못 또는 다른 뭔가?

답변:


13

그 진술에 도달 할 수있는 유일한 방법은 exec그 자체가 실패하는 것입니다. 성공하면 ffmpeg명령이 쉘을 완전히 대체합니다. ( &&이 경우에도 기본적으로 실패하므로 전혀 도달 할 수 없습니다.) 원하지 않는 exec경우에만 실행하십시오.


나는 &&ffmpeg 명령 후에 실제로 작동합니다. 이 장소에서 괜찮다면 여전히 질문이 하나 더 있습니다. 터미널 창을 사용하지 않고 어딘가에 ffmpeg의 stdout 및 stderr을 표시하는 방법이 있습니까? zenity fe처럼
tesseract

$()구문으로 변수 를 캡처 하여 변수에 전달하려고합니다 zenity. 인용 조심하고, zenity당신이 교체 할 필요가 있도록 내 경험에 pango와를 사용 <, &, >&lt;, &amp;, &gt;각각.
geekosaur 2016 년

5

exec command문에 현재 쉘을 대체합니다 command. 즉, 스크립트는 실제로 줄에서 종료됩니다 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.
    [...]

1

이것에 따르면 exec 쉘은 지정한 명령으로 바뀝니다. 따라서 스크립트는 exec.

당신은 필요하지 않습니다 exec. 명령을 지정하십시오.


0

exec서브 쉘에 넣으면 명령을 유지할 수 있습니다 .

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

알지만 &&아직도 잘못이 아닙니까?
tesseract

예. 그리고 유지하는 요점은 무엇 exec입니까?
jmtd
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.