Bu bash betiğinde neden bir komutun çıkış değerlerini alamıyorum?


9

Bu yüzden videoya mp3 kodlamak için bu küçük nautilus komut dosyasını yazıyordum:

#! /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

Sorun, ffmpeg komutu başarıyla yürütülmesine rağmen if [ "$?" -eq 0 ]

tetiklenmiyor gibi görünüyor. Neden? &&Yanlış mı yoksa başka bir şey mi?

Yanıtlar:


13

Bu ifadeye ulaşmanın tek yolu, execkendisinin başarısız olması; başarılı olursa, ffmpegkomut kabuğu tamamen değiştirir. (Pedant olarak, &&bu durumda da başarısız olur, böylece ona ulaşılamaz.) Bunu istemezsiniz exec, sadece çalıştırın.


Anlıyorum ve &&ffmpeg komutundan sonra olmadan gerçekten çalışıyor. Hala bir soru daha var, eğer bu yerde sorun yok - bir yerde ffmpeg stdout ve stderr bir terminal penceresi kullanmadan görüntülemek için bir yolu var mı? Zenity fe gibi
tesseract

Yapıyla birlikte $()bir değişkeni yakalamak ve sonra bu değişkeni iletmek istersiniz zenity. Alıntı dikkat ve zenitydeğiştirmek gerekir böylece benim durumumda Pango kullanır <, &, >ile &lt;, &amp;, &gt;sırasıyla.
geekosaur

5

exec commandDeyimi ile şimdiki kabuk değiştirir command. Yani, betiğiniz satırda hemen sonlanır exec ffmpeg ...; kalan satırlar yalnızca ffmpegkomut PATH'ınızda bulunamazsa (veya başka nedenlerle başlatılamazsa) yürütülür .

Bash komut istemine execyazarak yerleşik bash hakkında daha fazla bilgi edinebilirsiniz 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

Buna göre exec kabuğu belirttiğiniz komutla değiştirir. Yani betiğiniz asla geçmiş komutlara ulaşmıyor exec.

İhtiyacınız yok exec. Sadece komutu belirtin.


0

Sen devam edebilir execEğer bir kabuktaki içine koyarsanız komutu:

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

Anlıyorum, ama &&hala yanlış değil mi?
tesseract

Evet. Ve tutmanın anlamı execnedir?
jmtd
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.