Bash中的'read'命令在使用多进程时出现问题,或者是Bash本身存在问题,或者是我犯了一些错误吗?

14 浏览
0 Comments

Bash中的'read'命令在使用多进程时出现问题,或者是Bash本身存在问题,或者是我犯了一些错误吗?

我在文件夹中有三个.wav文件,我想用ffmpeg将它们转换成.mp3。我写了这个bash脚本,但是当我执行它时,只有第一个文件被转换成mp3。我应该怎么做才能让脚本继续处理我的文件呢?这是脚本内容:

#!/bin/bash
find . -name '*.wav' | while read f; do
    ffmpeg -i "$f" -ab 320k -ac 2 "${f%.*}.mp3"
done

0
0 Comments

问题原因:在使用Bash进行多进程处理时,使用“read”命令可能存在问题。

解决方法:可以尝试添加一个暂停时间来避免问题的发生。以下是一个解决方法的示例代码:

#!/bin/bash
FILES="/path/*.mp4"
for f in $FILES
do
   echo "------Processing $f VIDEO..."
   sudo ffmpeg -i "$f" -vn -ar 44100 -ac 2 -ab 192K -f mp3 "$f.mp3"
   echo "======Processed to $f.mp3"
   read -t 3 -p "Pause 3 sec ..."
done

将以上代码保存为一个.sh脚本文件,并给予执行权限。然后通过sudo命令运行该脚本。

解决方法中使用了read命令,并设置了一个3秒的暂停时间,以避免可能的问题。

0
0 Comments

在使用Bash中的多进程时,使用'read'命令存在问题。问题的原因可能是在交互模式下使用'read'命令时,Bash本身存在问题,或者可能是我自己犯了一些错误。

要解决这个问题,可以使用以下方法之一:

1. 使用'-nostdin'标志禁用交互模式:

ffmpeg -nostdin -i "$f" -ab 320k -ac 2 "${f%.*}.mp3"

2. 或者让'ffmpeg'从控制终端而不是标准输入读取输入:

ffmpeg -i "$f" -ab 320k -ac 2 "${f%.*}.mp3" 

可以在ffmpeg文档中查看'-stdin'/'-nostdin'标志的详细信息。

0
0 Comments

问题出现的原因是在使用多进程时,在Bash中使用`read`命令可能会出现问题。解决方法是将标准输入重定向到`/dev/null`,即使用`find ... | while read f; do ffmpeg ... < /dev/null; done`。

如果需要使用`find`(用于查找子目录或执行更高级的过滤),可以尝试以下命令:

find ./ -name "*.wav" -exec sh -c 'ffmpeg -i "$1" -ab 320k -ac 2 "$(basename "$1" wav).mp3"' _ {} \;

将`find`的输出传递给`while`循环有两个缺点:

1. 在匹配的文件名中包含换行符的情况下,它会失败(可能很少出现)。

2. 由于某种未知原因,`ffmpeg`会从标准输入读取数据,这会干扰`read`命令。解决方法很简单,只需将标准输入重定向到`/dev/null`,即`find ... | while read f; do ffmpeg ... < /dev/null; done`。

无论如何,不要将命令存储在变量名中并使用`eval`进行评估。这是一种危险的做法,也是一个不好的习惯。如果确实需要将实际命令行分解为更小的部分,请使用shell函数。

0