首页 > 解决方案 > 有没有人在 HPC 上通过 SBATCH 设置成功地在 bash 中使用 shopt -s extglob(扩展通配符)?

问题描述

总结一下:

我正在使用 bash shell,版本:4.2.46(2)-release

我想向 slurm 作业调度程序提交一个批处理作业脚本,在该脚本中,我使用扩展通配符,该扩展通配符在我尝试使用的扩展通配符命令的单独行上使用 shopt -s extglob 打开。

我想运行这些命令:

echo !(wmparc.nii.gz)
#  for sid in $SubIdStr; do

#     cd $sid
#     rm -r rfMRI T2w
#     cd T1w
#     rm -r !(wmparc.nii.gz)
#     cd ..
#     cd MNINonLinear/
#     rm -r !(wmparc.nii.gz|T1w_restore_brain.nii.gz|Results)
#     cd ..
#     cd ..

#  done

我曾尝试在这些命令之前使用 shopt -s extglob 并在它们之间添加换行符,例如。:

shopt -s extglob

echo !(wmparc.nii.gz)

这不起作用,并且在之后编写 shopt extglob 时,没有显示打开或关闭扩展 globbing 输出到我的日志文件。

我发现 shopt -s extglob 唯一可以工作的地方就在一开始,例如:

#!/bin/bash
shopt -s extglob

然而,这是一个问题,因为我的 SBATCH 设置没有被解释,例如。:

#SBATCH --mail-type=END                         
#SBATCH --mail-user=
#SBATCH --partition=imgcomputeq
#SBATCH --qos=img
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --mem=5g
#SBATCH --time=50:00:00

这是手册中对 sbatch 的描述:

sbatch 向 Slurm 提交一个批处理脚本。批处理脚本可以通过命令行上的文件名提供给 sbatch,或者如果没有指定文件名,sbatch 将从标准输入中读取脚本。批处理脚本可能包含在脚本中任何可执行命令之前以“#SBATCH”开头的选项。一旦到达脚本中的第一个非注释非空白行,sbatch 将停止处理进一步的#SBATCH 指令。

我试图删除所有内容的目录,但扩展 glob 中包含的文件是我要删除的目录和文件的混合。

我很好奇是否有人以前遇到过这个问题/知道解决方法?或者可以提供替代解决方案?

标签: linuxbashhpcslurmsbatch

解决方案


更POSIX(兼容)的解决方法,因此,有争议,更好:

for sid in $storeIdStr; do

  rm -r $sid/rfMRI $sid/T2w
  find $sid/MNINonLinear/ -maxdepth 1 -mindepth 1 ! -name 'wmparc.nii.gz' ! -name 'T1w_restore_brain.nii.gz' ! -name 'Results' -exec rm -rf {} \;
  find $sid/T2w/ -maxdepth 1 -mindepth 1 ! -name 'T2w_acpc.nii.gz' -exec rm -rf {} \;
  find $sid/T1w/ -maxdepth 1 -mindepth 1 ! -name 'wmparc.nii.gz' -exec rm -rf {} \;

done

仍然有兴趣听到任何人关于为什么必须将 shopt -s extglob 放在脚本开头或与 SBATCH 设置结合使用时其他任何人的经验的答案吗?


推荐阅读