使用固定随机种子调用shuf执行sh脚本时报文件不存在错误如何解决?
问题诱因
- 脚本中使用的
<(命令)属于进程替换语法,是Bash、Zsh等Shell的扩展特性,并未纳入POSIX标准sh的功能范围 - 执行
sh run.sh时调用的是POSIX标准sh解释器,无法识别进程替换语法,会直接将<(get_seeded_random 42)作为普通文件名传递给shuf,shuf找不到对应路径的文件就会抛出该报错 source run.sh是在当前交互Shell(多数系统默认是Bash或Zsh,支持进程替换)中直接执行脚本内容,因此不会触发报错- 同类写法在sort命令中可正常运行,本质是测试时直接在交互Shell执行了命令,而非通过
sh 脚本的方式调用,若用sh执行包含进程替换的sort命令同样会报错
解决方法
- 方法1:指定支持进程替换的Shell执行脚本
两种实现方式任选其一:- 在脚本首行添加Shebang声明
#!/bin/bash,给脚本添加执行权限(chmod +x run.sh)后直接用./run.sh运行 - 执行脚本时直接指定Bash解释器:
bash run.sh
- 在脚本首行添加Shebang声明
- 方法2:兼容POSIX sh标准写法,避免使用进程替换
先将随机种子生成的内容写入临时文件,再传递给shuf调用,示例代码如下:function get_seeded_random() { seed="$1" openssl enc -aes-256-ctr -pass pass:"$seed" -nosalt \ </dev/zero 2>/dev/null } # 生成临时随机源文件,$$为当前进程ID避免重名冲突 get_seeded_random 42 > /tmp/seeded_random.$$ shuf -i1-100 --random-source=/tmp/seeded_random.$$ # 执行完成后删除临时文件 rm -f /tmp/seeded_random.$$
内容的提问来源于stack exchange,提问作者Sep
相关产品推荐
相关产品推荐

