Więc pisałem ten mały skrypt nautilus do transkodowania wideo na 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
Problem polega na tym, że polecenie ffmpeg zostało pomyślnie wykonane if [ "$?" -eq 0 ]
wydaje się nie zostać wyzwolony. Dlaczego? Czy to &&
źle, czy może coś innego?
&&
polecenia ffmpeg to faktycznie działa. Nadal mam jeszcze jedno pytanie, czy w tym miejscu jest w porządku - czy istnieje sposób, aby wyświetlić gdzieś stdout i stderr ffmpeg bez użycia okna terminala? Jak w zenity fe$()
konstrukcją do zmiennej, a następnie przekazać tę zmienną dozenity
. Uważaj na cytowanie, azenity
moje doświadczenie wykorzystuje Pango więc trzeba wymienić<
,&
,>
z<
,&
,>
odpowiednio.exec command
Oświadczenie zastępuje bieżącą powłokę zcommand
. Oznacza to, że skrypt faktycznie kończy się w liniiexec ffmpeg ...
; pozostałe wiersze zostaną wykonane, jeśli i tylko wtedy, gdyffmpeg
polecenie nie zostanie znalezione na twojej ŚCIEŻCE (lub nie można go uruchomić z innych powodów).Możesz uzyskać więcej informacji na temat
exec
wbudowanej wersji bash, pisząchelp exec
w wierszu polecenia bash:źródło
Zgodnie z tym
exec
zastępuje powłokę podanym poleceniem. Więc twój skrypt nigdy nie dociera do poleceń przekraczającychexec
.Nie trzeba
exec
. Wystarczy podać polecenie.źródło
Możesz zatrzymać
exec
polecenie, jeśli umieścisz je w podpowłoce:źródło
&&
nadal nie jest źle?exec
?