背景 我是Bash脚本的新手,通过谷歌搜索,我已经尽我所能。
我有两个文本文件: 包含
的“Filemp3.txt”songname - artist.mp3
songname2 - artist2.mp3
songname3 - artist3.mp3
和包含
的Fileogg.txtsongname - 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没有显示我所知道的任何错误。
答案 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"