Bash脚本执行onmt_translate后results变量赋值为空问题
问题根因
results变量赋值为空不是bash语法问题,是onmt_translate的输出规则和预期不符:
- 命令携带
-output model1_step_10000_temp_pred参数时,核心翻译结果会直接写入指定的输出文件,不会输出到标准输出流 - 携带
-verbose参数打印的运行进度、日志信息默认走标准错误流(stderr),而命令替换$()默认仅捕获标准输出流(stdout)的内容,自然只能拿到空值。
修复方案
方案1:直接读取输出文件获取翻译结果(推荐,匹配脚本需求)
脚本本身需要的是最终IPA转录结果,无需捕获命令运行输出,直接读取-output参数指定的结果文件即可,替换对应代码段如下:
#!/usr/bin/env bash if [ -z "$1" ] then echo "You did not enter a word for translation, Please enter one now: " read current else current=$1 fi echo "The word you chose for translation: $current" onmt_word=$(python ONMT_DATA_FORMAT.py "$current") # 变量引用加双引号避免特殊字符解析异常 echo "$onmt_word" > temp_word.txt # 直接运行翻译命令,结果写入指定文件 onmt_translate -gpu -1 -model eng_ipa_model1_steps/eng_ipa_model1_step_100000.pt -src temp_word.txt -replace_unk -verbose -output model1_step_10000_temp_pred echo "The provided IPA translation is:" # 直接从结果文件中过滤提取目标IPA内容 egrep -o '< .* >' model1_step_10000_temp_pred echo "Please ignore the first and last symbol, these are needed for the translation process."
方案2:捕获命令运行日志
如果确实需要把-verbose输出的运行日志存入变量,需要将标准错误流重定向到标准输出流,修改赋值语句如下:
results=$(onmt_translate -gpu -1 -model eng_ipa_model1_steps/eng_ipa_model1_step_100000.pt -src temp_word.txt -replace_unk -verbose -output model1_step_10000_temp_pred 2>&1)
注意:该方法捕获的是运行日志,并非最终翻译结果,最终转录结果仍然存储在
-output指定的文件中,不要混淆。
额外优化建议
- 所有变量引用时建议包裹双引号,比如
echo "$onmt_word"、echo "$results",避免IPA特殊符号、空格被shell错误解析导致内容丢失、格式错乱 - 脚本开头可添加
set -e配置,前置命令执行失败时直接退出,避免后续逻辑在异常状态下运行输出空内容
内容的提问来源于stack exchange,提问作者NinjaWarrrior
相关产品推荐
相关产品推荐

