BASH脚本在执行一行后停止,但如果我使用echo而不是exec,则脚本的输出完成

时间:2014-01-22 14:40:50

标签: bash sox

背景 我是Bash脚本的新手,通过谷歌搜索,我已经尽我所能。

我有两个文本文件: 包含

的“Filemp3.txt”

songname - artist.mp3

songname2 - artist2.mp3

songname3 - artist3.mp3

和包含

的Fileogg.txt

songname - artist.ogg

songname2 - artist2.ogg

songname3 - artist3.ogg

我将使用SOX将MP3转换为Ogg。

我有以下bash脚本:

#!/bin/bash

exec 3<Fileogg.txt

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

这完全输出了我想要逐行运行的命令。

radio@radio:~$ ./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”...脚本运行&amp;创建了一个ogg文件,但只创建了第一个文件名。

我假设这是我的Bash脚本的一个问题,因为ogg文件播放正常,而且Sox没有显示我所知道的任何错误。

2 个答案:

答案 0 :(得分:2)

exec命令使用新命令替换当前进程中正在执行的命令。这就像一个永不返回的子程序调用。在这种情况下,您只需要致电sox,然后在返回后继续,只需删除exec

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

答案 1 :(得分:1)

exec有两个不相关的含义,这可能是你感到困惑的地方。你使用的第一个:

exec 3<Fileogg.txt

很好,它会为文件'Fileogg.txt'打开文件描述符编号3,并使用您的read -u3阅读。

第二次使用exec,即在同一过程中将当前的程序替换为另一个程序。成功exec没有回复。所以当你:

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

bash替换sox,所以你永远不会回到脚本!

只需删除exec,您就不需要它了:

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