TTS项目中如何编写指定目录执行、依前序结果触发的Bash脚本?
编写带条件执行的Bash脚本(针对TTS项目)
没问题,我来帮你搞定这个Bash脚本的需求,它会先切换到指定目录执行TTS生成命令,只有当这条命令成功完成后,才会执行音频播放命令。
方案一:简洁的链式执行写法
这是最紧凑的写法,利用Bash的&&条件执行符实现“前命令成功才执行后命令”的逻辑:
#!/bin/bash # 定义目标工作目录,后续修改只需改这里 WORK_DIR="/opt/text/example" # 切换到目标目录,失败则直接退出脚本 cd "$WORK_DIR" || { echo "Error: 无法切换到目录 $WORK_DIR,脚本终止"; exit 1; } # 执行TTS生成命令,成功后自动执行播放命令 sudo ./bin/sample_read -I ../languages/ -I ../languages -v dave -T 2 \ -i /opt/text/example.txt -F 22 -O embedded-pro -o out_file.pcm && { echo "✅ TTS音频文件生成成功,开始播放..." aplay -f S16_LE -r 22050 -c 1 out_file.pcm }
关键细节说明:
#!/bin/bash:指定脚本使用Bash解释器执行,这是Linux脚本的标准开头。cd "$WORK_DIR" || { ... }:如果切换目录失败(比如目录不存在、权限不足),会立即打印错误信息并退出脚本,避免后续命令在错误路径下执行。- 命令末尾的
\:用来拆分长命令为多行,提升可读性,脚本执行时会自动忽略这个换行符。 &&:Bash的核心条件执行符,只有前面的命令退出状态码为0(执行成功),才会执行后面的命令块。
方案二:更灵活的if判断写法
如果需要在命令失败时做额外处理(比如打印详细错误提示、清理临时文件),可以用if语句实现更清晰的分支逻辑:
#!/bin/bash WORK_DIR="/opt/text/example" # 切换目录失败则退出 cd "$WORK_DIR" || { echo "Error: 无法切换到目录 $WORK_DIR,脚本终止"; exit 1; } # 执行TTS生成命令 sudo ./bin/sample_read -I ../languages/ -I ../languages -v dave -T 2 \ -i /opt/text/example.txt -F 22 -O embedded-pro -o out_file.pcm # 检查上一条命令的执行结果 if [ $? -eq 0 ]; then echo "✅ TTS音频文件生成成功,开始播放..." aplay -f S16_LE -r 22050 -c 1 out_file.pcm else echo "❌ TTS音频文件生成失败,跳过播放步骤" # 这里可以添加失败后的清理逻辑,比如删除未生成完成的文件 # rm -f out_file.pcm exit 1 fi
关键细节说明:
$?:Bash内置变量,存储上一条命令的退出状态码,0代表成功,非0代表失败。if [ $? -eq 0 ]:判断上一条命令是否成功,成功则进入播放分支,失败则进入错误处理分支。
使用注意事项
- 权限问题:确保你对
/opt/text/example目录有访问权限,并且拥有执行./bin/sample_read的权限,以及sudo的执行权限(如果需要的话)。 - 文件覆盖:如果
out_file.pcm已经存在,第一条命令会直接覆盖它。如果需要保留历史文件,可以给输出文件名添加时间戳,比如out_file_$(date +%Y%m%d_%H%M%S).pcm。 - 测试建议:先手动执行第一条命令,确认它能正常生成
out_file.pcm,再运行脚本,这样能快速排查问题。
内容的提问来源于stack exchange,提问作者Ns2100
相关产品推荐
相关产品推荐

