2013-02-05 38 views
7

Bir bash komut dosyasındaki yorumlardaki değişkenleri genişletmek mümkün mü?Açıklamalarda değişken genişletme

SGE içine beslemek için bir komut dosyası yazmak istiyorum. qsub sözdizimi, #$ ile başlayan bash komut dosyasının içindeki satırları kullanarak grid motoruna ek parametreler iletmeme izin verir. Örneğin,

#$ -q all.q 
#$ -S /bin/bash 
#$ -V 
#$ -m beas 
#$ -o run_20120103.out 

İstediğim -o parametre dinamik bir değişkene ayarlanmış olmasıdır, $1 söylüyorlar. çizgi bir # ile başlar beri Yani safça, Ancak

#$ -o run_${1}.out 

yazardı, bash bunu göz ardı eder ve değişken $1 genişletilmediğinde.

Herhangi bir fikrin var mı? Bazı bash önişlemcisi? Başka bir yol var mı?

EDIT Örnek olarak $1'u seçtim. $FOO veya $BAR da olabilir.

+0

$ değerini {1 belirlemektir Ne: Örneğin, ben yerine hile olacaktır paretheses olmadan

#$ -o run_${TASK_ID}.out 

yaz yapmanın, komut TASK_ID dahil etmek isterseniz } Küme/ızgara üzerinde farklı işler yüklemek için bir döngü yapıyor musunuz? –

+0

evet, işte bu kadar. –

+2

Bu durumda qsub'a qsub komutunu, $ qo yerine qsub'a yazarak yerine -o seçeneğiyle çağırabilirsiniz. –

cevap

4

Kabuk belleğinde değişken genişletme gerçekleşir, dosyayı etkilemez. Bu nedenle, bashın ne kadar genişlediği önemli değil.

cat << EOF | qsub [options] - 
#$ -o run_$1.out 
cmds 
EOF 
+0

Bu betiğin adım adım ne yaptığını tam olarak açıklayabilir misiniz? Bunu denedim ama davranışın ne olması gerektiği konusunda hiçbir fikrim yok ve beklediğim davranışı alamıyorum. Oldukça yararlı değil – Gullydwarf

+0

@Gullydwarf Bu betik tam veya kendinden emin bir örnek değildir.Sadece metinde değişkenleri genişletmek için qsub'a beslemeden önce sözdizimsel bir yapı gösterir. –

+0

Olabilir mi? İşlerim için değişken bir duvar süresini genişletmek için aradığım şey bu olabilir. Qsub'da duvar zamanı için -o gibi bir seçenek yok mu? Bu çok daha kolay hale getirebilirdi: p Düzenleme: Sanırım onu ​​buldum, qsub seçeneği olarak da kullanılabiliyor, duvarları geçebileceğimi düşünüyorum. Şimdi test – Gullydwarf

0

, kabul edilen yanıt daha spesifik biraz daha sge olmak sadece standart çıkışını yönlendirmek için:

Bunun yerine, muhtemelen bir yerde genişletilmiş her şeyi anında çalıştırılacak komut dosyası oluşturabilir qsub ve iş kimliğini ayrıştırın. Daha sonra bu işi qalter aracılığıyla değiştirmek için kullanabilirsiniz.

İşte böyle bir işi göndermek ve değiştirmek için kullandığım bir komut dosyası örneği.

for a in $args; 
do 
    qsub submission_script $a 1> job.txt 
    jid=$(cat job.txt | tr -dc '0-9' | cut -c -6) 
    qalter $jid -N $a 
done 

Bunu yapmak için daha fazla deyimsel yolu vardır eminim, ama bu ilk defa yürürlükte.

Bu yaklaşım, submission_script'un kendi argümanlarına sahip olmasına izin verir. Ayrıca, sadece ismini değil, diğer iş özelliklerini programsal olarak değiştirmenizi sağlar.

-2

Farklı çıktı veya hata günlükleri oluşturmak için SGE'de qsub komutunu da kullanıyorum.

#$ -o run_$TASK_ID.out 
+0

Hayır, bu hile yapmaz. Run_ $ TASK_ID.out adlı bir dosya alırsınız, değişken değerine göre değiştirilmez. – matthieu