เหตุใดฉันจึงไม่สามารถรับค่าทางออกของคำสั่งในสคริปต์ทุบตีนี้


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 มันใช้งานได้จริง ฉันยังมีคำถามอีกหนึ่งคำถามถ้าไม่เป็นไรที่นี่ - มีวิธีแสดง stdout และ stderr ของ ffmpeg ที่ไหนสักแห่งโดยไม่ต้องใช้หน้าต่างเทอร์มินัลหรือไม่? เช่นเดียวกับใน zenity fe
tesseract

คุณต้องการที่จะจับมันกับสร้างลงในตัวแปรแล้วส่งผ่านตัวแปรที่$() zenityดูจากการอ้างและzenityในประสบการณ์ของผมใช้ Pango ดังนั้นคุณจำเป็นต้องเปลี่ยน<, &, >กับ&lt;, &amp;, &gt;ตามลำดับ
geekosaur

5

คำสั่งแทนที่เปลือกปัจจุบันด้วยexec command commandนั่นคือสคริปต์ของคุณ actaully ยุติสายexec ffmpeg ...; บรรทัดที่เหลือจะถูกดำเนินการถ้าหากffmpegไม่พบคำสั่งบน PATH ของคุณ (หรือไม่สามารถเรียกใช้งานได้ด้วยเหตุผลอื่น)

คุณสามารถรับรายละเอียดเพิ่มเติมเกี่ยวกับexecbash ภายในได้โดยพิมพ์help execที่พรอมต์คำสั่ง bash:

$ 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คำสั่งถ้าคุณใส่ไว้ใน subshell:

- 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.