Bash中的'read'命令在使用多进程时出现问题,或者是Bash本身存在问题,或者是我犯了一些错误吗?
问题原因:在使用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秒的暂停时间,以避免可能的问题。
在使用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'标志的详细信息。
问题出现的原因是在使用多进程时,在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函数。