2014-09-12 8 views
0

Я хочу выбрать несколько моделей из папки и использовать их в сценарии sge для задания массива. Так что я следующий в SGE сценария:Использовать переменные в качестве параметров аргументов внутри сценария qsub

MODELS=/home/sahil/Codes/bistable/models 
numModels=(`ls $MODELS|wc -l`) 
echo $numModels 

#$ -S /bin/bash 
#$ -cwd 
#$ -V 
#$ -t 1-$[numModels] # Running array job over all files in the models directory. 

model=(`ls $MODELS`) 
echo "Starting ${model[$SGE_TASK_ID-1]}..." 

Но я получаю следующее сообщение об ошибке:

Unable to read script file because of error: Numerical value invalid! 
The initial portion of string "$numModels" contains no decimal number 

Я также попытался использовать

#$ -t 1-${numModels} 

и

#$ -t 1-(`$numModels`) 

но ни один из этих работ. Любые предложения/альтернативные методы приветствуются, но они должны использовать функциональные возможности массива qsub.

ответ

2

Остерегайтесь, что Bash, #$ -t 1-$[numModels] - не более чем комментарий; поэтому он не применяет переменное расширение к numModels.

Одним из вариантов является передача -t аргумент в командной строке: удалить его из сценария:

#$ -S /bin/bash 
#$ -cwd 
#$ -V 

model=(`ls $MODELS`) 
echo "Starting ${model[$SGE_TASK_ID-1]}..." 

и представить сценарий с

MODELS=/home/sahil/Codes/bistable/models qsub -t 1-$(ls $MODELS|wc -l) submit.sh 

Если вы предпочитаете иметь само- , другой вариант состоит в том, чтобы передать содержимое всего скрипта через stdin следующим образом:

#!/bin/bash 
qsub <<EOT 
MODELS=/home/sahil/Codes/bistable/models 
numModels=(`ls $MODELS|wc -l`) 
echo $numModels 

#$ -S /bin/bash 
#$ -cwd 
#$ -V 
#$ -t 1-$[numModels] # Running array job over all files in the models directory. 

model=(`ls $MODELS`) 
echo "Starting ${model[$SGE_TASK_ID-1]}..." 
EOT 

Затем вы отправляете или выполняете этот скрипт непосредственно, чтобы отправить свой массив заданий (./submit.sh, а не qsub submit.sh, так как команда qsub является частью скрипта.

+0

Это действительно так, но мне бы очень хотелось, чтобы решение находилось внутри самого скрипта sge, а не завершено оболочным скриптом или помещением аргументов в командной строке. –

+0

@ Сахил, это скорее всего невозможно. Сценарий SGE будет выполняться один раз для каждой задачи, от 1 до вычисленного общего числа задач. Таким образом, определение общего количества задач должно выполняться до выполнения сценария SGE. Это то, что Дэмиен ускользает. – Vince

+0

@Vince, я следую этому, но -t в любом случае принимает статический числовой аргумент в скрипте SGE. Все, что я говорю, это заменить верхнюю границу переменной, она не будет изменяться с каждой задачей задания массива. Если для этого нет никаких положений, я, вероятно, просто буду писать номер вручную, чтобы избежать обертывания qsub sh, у которого есть свой набор проблем. –