2014-01-22 60 views
0

背景 我是新手來砸腳本,並通過谷歌搜索我已經得到儘可能我有。bash腳本停止,但如果我使用EXEC的回聲,而不是腳本的輸出完畢

我有兩個文本文件:包含 「Filemp3.txt」

SONGNAME - artist.mp3

songname2 - artist2.mp3

songname3 - artist3.mp3

和Fileogg.txt包含

songname - artist.ogg

songname2 - artist2.ogg

songname3 - artist3.ogg

我將使用SOX從MP3轉換爲奧格。

我有以下bash腳本:

#!/bin/bash 

exec 3<Fileogg.txt 

while read mp3; do 
     read -u3 ogg 
     echo sox "Musicmp3/$mp3" "Musicogg/$ogg" 
done <Filemp3.txt 

這個輸出正是我想通過線運行線路的命令。

[email protected]:~$ ./convert-mp3-ogg.sh 
sox Musicmp3/songname - artist.mp3 Musicogg/songname - artist.ogg 
sox Musicmp3/songname2 - artist2.mp3 Musicogg/songname2 - artist2.ogg 
sox Musicmp3/songname3 - artist3.mp3 Musicogg/songname3 - artist3.ogg 

但是,當我編輯腳本來執行,例如, EXEC SOX「Musicmp3/$ MP3」,「Musicogg/$ OGG」 ......在腳本運行&的OGG文件被創建,但只對第一個文件名。

我假定這是我的bash腳本問題的OGG文件播放罰款,紅襪不顯示我所知道的任何錯誤。

+0

爲什麼不直接使用源的一個文件,並做 「SOX Muxicmp3/$ MP3 Musicogg/$ {MP3%MP3} OGG」 - 使用輸入文件名稱,但更改目的地的擴展名?或者你有一些你想將'x.mp3'轉換爲'y.ogg'的情況? – twalberg

回答

2

exec指令用新命令替換當前進程中執行的命令。這就像一個永不返回的子程序調用。在這種情況下,你只是想打電話sox,並繼續返回後,所以剛落exec

while read mp3; do 
    read -u3 ogg 
    sox "Musicmp3/$mp3" "Musicogg/$ogg" 
done < Filemp3.txt 
+1

暫時地,'exec'取代了當前的*程序*,過程是一樣的。 – cdarke

+0

謝謝你chepner,工作的一種享受 - 也感謝與他人相同的答案和解釋 – user3223819

1

還有的exec兩個不相關的含義,這可能是你在哪裏困惑。您使用的第一個:

exec 3<Fileogg.txt 

是好的,它會打開文件描述符 3號文件「Fileogg.txt」,並請閱讀read -u3

儘管存在exec的第二種用法,那就是用相同的過程替換當前的程序與不同的程序。有沒有從一個成功的exec回報。所以,當你:

exec sox "Musicmp3/$mp3" "Musicogg/$ogg" 

替換bashsox,所以你永遠不會返回到腳本!

只需卸下exec,你不要在這裏需要它:

sox "Musicmp3/$mp3" "Musicogg/$ogg"