【问题标题】:$(dirname $PWD) is returning null or is empty$(dirname $PWD) 返回 null 或为空
【发布时间】: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)”,它也给出了正确的输出。

标签: bash slurm sbatch pwd


【解决方案1】:

由于您使用的是$PARENT_DIR unscaped,因此在将完整的heredoc 传递给sbatch 之前,您的变量会被评估,请尝试转义$,例如:\$PARENT_DIR

【讨论】:

  • 是的!你说的对。在 echo 语句中,我刚刚添加了 \$PARENT_DIR 并且它打印正确。这或许可以解释为什么我的 SLURM_ARRAY_TASK_ID 也是空的
  • @RforResearch 要转义整个 here-doc,您可以引用分隔符:&lt;&lt; 'EOT'
  • 这是否意味着它也适用于 $SLURM_ARRAY_TASK_ID 作为参数传递时?你的意思是我把'EOT'放在开头和结尾吗?
猜你喜欢
  • 2013-11-26
  • 1970-01-01
  • 2019-09-11
  • 2021-10-21
  • 1970-01-01
  • 2015-11-24
  • 2010-12-30
  • 1970-01-01
  • 2017-01-13
相关资源
最近更新 更多