问题
我正在尝试创建一个脚本,该脚本自动设置使用变量--chdir
运行sbatch命令的目录。我的目标是创建一个单一的模板文件,让经验不足的用户可以轻松地运行我的代码。
环境
在我运行的系统中,所有用户都分配了一个大文件存储目录,看起来像/path/$USER
。该路径不是$HOME
目录,也不会作为环境变量存储在其他位置。所有用户都被分配了一个Slurm帐户,其中Slurm用户名与$USER
匹配。这意味着Slurm特定变量%u
与$USER
相同。
最小(非(-工作示例
#!/bin/bash
#SBATCH --partition=debug_5min
#SBATCH --ntasks=1
#SBATCH --mem=4000
#SBATCH --output=jobname_%J_stdout.txt
#SBATCH --error=jobname_%J_stderr.txt
#SBATCH --time=00:05:00
#SBATCH --job-name=user_pass
#SBATCH --chdir=/path/%u
#
################################################
touch testfile.txt
MnWE结果
批处理执行,并且在运行完成时不会生成任何文件(testfile.txt、stdout、stderr(。如果我对这个测试脚本进行一些挖掘,我会被告知运行失败,并且输出被重定向到/tmp/
。
什么有效,但没有达到目标
我可以在脚本之前传递--chdir
,而不是直接执行sbatch test.sh
,从而允许我使用$USER
。命令看起来像:
sbatch --chdir=/path/$USER test.sh
但这并不能解决最初的目标,即制作一个脚本,如果终端用户害怕终端,则不需要太多思考。
问题-重述
有没有办法在--chdir
sbatch标头中使用变量?
为什么%u
的行为不像我所期望的那样?
一种解决方案可以将--chdir
参数替换为对cd
命令的调用,并为--output
和--error
指令提供绝对路径:
#!/bin/bash
#SBATCH --partition=debug_5min
#SBATCH --ntasks=1
#SBATCH --mem=4000
#SBATCH --output=/path/%u/jobname_%J_stdout.txt
#SBATCH --error=/path/%u/jobname_%J_stderr.txt
#SBATCH --time=00:05:00
#SBATCH --job-name=user_pass
#
################################################
cd /path/$USER || exit -1
touch testfile.txt
至于您重述的问题,Bash不会扩展#SBATCH ...
行中的变量,因为这些变量被解释器视为注释,而Slurm不会努力完成这项工作。
并且--chdir
参数只是不接受模式(如%u
(;只有简单的字符串。