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



背景我是一名新手,可以击中脚本,通过谷歌搜索,我已经拥有了。

我有两个文本文件:包含

的" filemp3.txt"

songname -Artist.mp3

songname2 -artist2.mp3

songname3 -artist3.mp3

和包含

的fileogg.txt

songname -Artist.ogg

songname2 -Artist2.ogg

songname3 -atrest3.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时,例如exec sox" musicmp3/$ mp3" musicogg/$ ogg" ...脚本运行&amp;创建了一个OGG文件,但仅适用于第一个文件名。

我假设这是我的bash脚本的问题,因为OGG文件效果很好,Sox没有显示我知道的任何错误。

exec命令替换 用新命令在当前过程中执行的命令。这就像一个永远不会返回的子例程呼叫。在这种情况下,您只想致电sox,然后在返回后继续,因此只需删除exec

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

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

exec 3<Fileogg.txt

很好,它打开文件描述符 file'fileogg.txt'的数字3,并使用您的read -u3读取。

不过,在同一过程中,exec的第二次使用是用不同的程序替换为当前 program 。成功的exec没有回报。所以当你:

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

sox代替bash,因此您永远不会返回脚本!

只需删除exec,您在这里不需要它:

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

相关内容

  • 没有找到相关文章

最新更新