将 bash 变量传递给存储为单独 "commands.txt" 的命令列表

Pass bash variables to a list of commands stored as a separate "commands.txt"

我有以下 PBS 脚本:

#!/bin/bash -l
#PBS -l walltime=12:00:00,nodes=1:ppn=24,pmem=2580mb

((start=24))
((n_jobs_procimg=8))

cd $PBS_O_WORKDIR
conda activate msi_sip_37

module load parallel
parallel -u -j 3 < commands.txt
wait

而commands.txt的内容是:

python runs/process_img.py --n_jobs $n_jobs_procimg --msi_test True --idx_min $start+0 --idx_max $start+8
python runs/process_img.py --n_jobs $n_jobs_procimg --msi_test True --idx_min $start+8 --idx_max $start+16
python runs/process_img.py --n_jobs $n_jobs_procimg --msi_test True --idx_min $start+16 --idx_max $start+24

我[错误地]期望 $start$n_jobs_procimg 应该可用于 commands.txt 中的命令,但是当我 运行 这份工作,我在 commands.txt:

中的每个命令得到以下错误
usage: process_img.py [-h] [-n N_JOBS] [-m MSI_TEST] [-i IDX_MIN] [-d IDX_MAX]
process_img.py: error: argument -n/--n_jobs: expected one argument

如何修改PBS脚本中的parallel命令,使$start$n_jobs_procimg传递给commands.txt?

在这种情况下,$start 应该是一个等于 24 的整数,$n_jobs_procimg 应该是一个等于 8 的整数。

这与我的问题无关,但对于上下文,process_img.py 脚本使用了一个多处理池,该池将处理核心的数量作为参数(--n_jobs),我想根据我可用的处理核心总数来控制它。

我会将这两个常量存储在单独的脚本中:

constants.sh:

((start=24))
((n_jobs_procimg=8)

然后使用来源:

#!/bin/bash -l
#PBS -l walltime=12:00:00,nodes=1:ppn=24,pmem=2580mb

source constants.sh

cd $PBS_O_WORKDIR
conda activate msi_sip_37

module load parallel
parallel -u -j 3 < commands.txt
wait

然后使用 commands.txt 也包含它:

source constants.sh
python runs/process_img.py --n_jobs $n_jobs_procimg --msi_test True --idx_min $start+0 --idx_max $start+8
python runs/process_img.py --n_jobs $n_jobs_procimg --msi_test True --idx_min $start+8 --idx_max $start+16
python runs/process_img.py --n_jobs $n_jobs_procimg --msi_test True --idx_min $start+16 --idx_max $start+24

这样一来,您就可以随处使用它们,如果有更改,只需编辑一个文件。

export 变量:

#!/bin/bash -l
#PBS -l walltime=12:00:00,nodes=1:ppn=24,pmem=2580mb

start=24
n_jobs_procimg=8
export start
export n_jobs_procimg

cd $PBS_O_WORKDIR
conda activate msi_sip_37

module load parallel
parallel -u -j 3 < commands.txt