【发布时间】:2021-07-25 10:40:49
【问题描述】:
我是 SBATCH 和 bash 的新手。我有一个简单的脚本来提交作业,我正在尝试获取当前工作目录的父目录。从文档看来,'$(dirname $PWD)' 是这样做的方法。但它总是返回 null 或为空。我尝试过非常不同的版本,例如'$(dirname '$PWD')' 或只是$(dirname $PWD)。它们都导致null。我怀疑遗漏了一些非常基本的东西。关于我应该检查什么以更好地解决或调试此问题的任何建议都会有所帮助。这是示例代码(简化)
#!/bin/bash
sbatch <<EOT
#!/bin/bash
#SBATCH --nodes=1
#SBATCH --cpus-per-task=$2
#SBATCH --partition=express
#SBATCH --time=01:00:00
#SBATCH --mem-per-cpu=4G
#SBATCH --output=$1_%A_%a.out
#SBATCH --array=0-4%5
#SBATCH --error=%A_$1_%a.err
#SBATCH --constraint=broadwell
PARENT_DIR="$(dirname $PWD)"
echo "Main directory for submit-test-express script is: $PARENT_DIR"
echo "Current drectory is: $PWD"
echo "Job array ID: $SLURM_ARRAY_JOB_ID , sub-job $SLURM_ARRAY_TASK_ID is running!"
python /path_to_code/code.py $1 $2 $3 $SLURM_ARRAY_TASK_ID /output_folder/ > output_file-$SLURM_ARRAY_JOB_ID-$SLURM_ARRAY_TASK_ID.out
EOT
代码封装在 EOT 中,以便可以从其他脚本传递参数。另请注意,第二个 echo 语句正确打印当前工作目录。但是第一个 echo 语句返回空白。
【问题讨论】:
-
您能登录到执行此操作的机器并在其外壳上发出简单的
$ dirname $PWD吗?这是否打印正确的值? -
感谢您的评论。我在发现集群上运行它。刚试过 {dirname $PWD} 它给了我正确的路径。
-
如果有帮助,我还发布了一个简单的“echo $(dirname $PWD)”,它也给出了正确的输出。