Tại sao tôi không thể nhận được các giá trị thoát của lệnh trong tập lệnh bash này?


9

Vì vậy, tôi đã viết kịch bản nautilus nhỏ này để chuyển mã video thành 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

Vấn đề là, mặc dù lệnh ffmpeg được thực thi thành công if [ "$?" -eq 0 ]

dường như không được kích hoạt. Tại sao vậy? Là &&sai hay là một cái gì đó khác?

Câu trả lời:


13

Cách duy nhất mà tuyên bố có thể đạt được là nếu execchính nó thất bại; nếu nó thành công, ffmpeglệnh thay thế hoàn toàn shell. (Về mặt giáo dục, ý &&chí cũng thất bại trong trường hợp đó vì vậy nó không thể đạt được.) Bạn không muốn execnó, chỉ cần chạy nó.


Tôi thấy, và không có &&lệnh ffmpeg thì nó thực sự hoạt động. Tôi vẫn còn một câu hỏi nữa, nếu nó ổn ở nơi này - có cách nào để hiển thị thiết bị xuất chuẩn và thiết bị xuất chuẩn của ffmpeg ở đâu đó mà không cần sử dụng cửa sổ đầu cuối không? Giống như trong zenity fe
tesseract

Bạn muốn nắm bắt nó với $()cấu trúc thành một biến, sau đó chuyển biến đó sang zenity. Coi chừng trích dẫn, và zenitytrong kinh nghiệm của tôi sử dụng Pango vì vậy bạn cần phải thay thế <, &, >với &lt;, &amp;, &gt;tương ứng.
geekizard

5

Câu exec commandlệnh thay thế shell hiện tại bằng command. Đó là, kịch bản của bạn thực sự chấm dứt tại dòng exec ffmpeg ...; các dòng còn lại sẽ được thực thi nếu và chỉ khi ffmpegkhông tìm thấy lệnh trên PATH của bạn (hoặc không thể khởi chạy vì lý do khác).

Bạn có thể biết thêm chi tiết về execbash tích hợp bằng cách gõ help exectại dấu nhắc lệnh 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

Theo điều này exec thay thế shell bằng lệnh bạn chỉ định. Vì vậy, kịch bản của bạn không bao giờ nhận được các lệnh qua exec.

Bạn không cần exec. Chỉ cần chỉ định lệnh.


0

Bạn có thể giữ execlệnh nếu bạn đặt nó vào một khung con:

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

Tôi hiểu, nhưng không phải &&vẫn còn sai ở đó?
tesseract

Đúng. Và quan điểm của việc giữ là execgì?
jmtd
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.