Bash Shell脚本输出日志时seed变量为空的原因及解决方法咨询
Bash脚本$seed变量为空问题原因及修复方案
触发原因
$RANDOM是Bash专属内置变量,仅在Bash解释器环境下会返回1~32767范围的随机整数值,触发该问题的常见场景如下:
- 脚本开头未添加
#!/bin/bash的shebang声明,系统默认调用sh、dash等不支持$RANDOM的解释器执行脚本 - 主动使用
sh 脚本名.sh的命令运行脚本,绕过了Bash执行环境 - (低概率)脚本之前的代码中执行了
unset RANDOM操作,清空了该内置变量
以上情况都会导致seed=$RANDOM赋值时$RANDOM被识别为未定义变量,最终$seed为空,生成形如你遇到的文件名:
ag.eda.32.gpu0..log
修复方法
方法1:强制使用Bash解释器执行(推荐)
在脚本最开头添加shebang声明,指定用Bash运行:
#!/bin/bash while true do seed=$RANDOM for dsn in ag uci nyt do for aug in eda bt do python -u augf.py --dsn ${dsn} --samplecnt 32 --aug ${aug} --gpu ${1} \ > ${dsn}.${aug}.32.gpu${1}.$seed.log done for aug in cbert cgpt do envcbert/bin/python -u augf.py --dsn ${dsn} --samplecnt 32 --aug ${aug} --gpu ${1} \ > ${dsn}.${aug}.32.gpu${1}.$seed.log done for genm in gpt ctrl do for nli in 0 1 do python -u augf.py --dsn ${dsn} --samplecnt 32 --aug generate --nli_check ${nli} --genm ${genm} --gpu ${1} \ > ${dsn}.generate.32.${genm}.nli${nli}.gpu${1}.$seed.log done done done done
添加后给脚本赋予执行权限:chmod +x 脚本名.sh,之后直接用./脚本名.sh运行即可,不要使用sh 脚本名.sh命令执行。
方法2:兼容非Bash环境的随机数生成
如果需要适配sh、dash等非Bash环境,可以替换seed=$RANDOM为通用随机数生成逻辑:
# 替换seed=$RANDOM为以下代码 seed=$(od -An -N2 -i /dev/urandom | tr -d ' ')
该逻辑从系统随机数设备读取值生成整数,不受shell解释器类型限制。
内容的提问来源于stack exchange,提问作者yanachen
相关产品推荐
相关产品推荐

