You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 ]:判断上一条命令是否成功,成功则进入播放分支,失败则进入错误处理分支。

使用注意事项

  1. 权限问题:确保你对/opt/text/example目录有访问权限,并且拥有执行./bin/sample_read的权限,以及sudo的执行权限(如果需要的话)。
  2. 文件覆盖:如果out_file.pcm已经存在,第一条命令会直接覆盖它。如果需要保留历史文件,可以给输出文件名添加时间戳,比如out_file_$(date +%Y%m%d_%H%M%S).pcm。
  3. 测试建议:先手动执行第一条命令,确认它能正常生成out_file.pcm,再运行脚本,这样能快速排查问题。

内容的提问来源于stack exchange,提问作者Ns2100

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:09:48