2013-02-05 26 views
7

Czy możliwe jest rozszerzenie zmiennych w komentarzach wewnątrz skryptu bash?Zmienna ekspansja komentarzy

Chcę napisać skrypt, który zostanie dodany do SGE. Składnia qsub pozwala mi przekazywać dodatkowe parametry do silnika siatki za pomocą linii wewnątrz skryptu bash, zaczynając od #$. Na przykład,

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

Co chcę jest, że parametr -o dynamicznie ustawić zmienną, powiedzmy $1. Więc ja naiwnie napisać

#$ -o run_${1}.out 

Jednak ponieważ linia zaczyna się #, bash ignoruje go i zmienna $1 nie jest rozwinięty.

Wszelkie pomysły? Jakiś preprocesor bash? W jakiś inny sposób?

EDYCJA Jako przykład wybrałem $1. Równie dobrze może być $FOO lub $BAR.

+0

Co jest określenie wartości $ {1 }? Czy robisz cykl, aby załadować różne zadania w klastrze/siatce? –

+0

tak, to wszystko. –

+2

W takim przypadku możesz po prostu wywołać qsub z opcją -o wewnątrz pętli zamiast wstawiania # $ -o wewnątrz skryptu wprowadzonego do qsub. –

Odpowiedz

4

Zmienna rozbudowa dzieje się w pamięci powłoki, nie ma wpływu na plik. Dlatego nie ma znaczenia, co rozszerzy się bash.

Zamiast tego prawdopodobnie można wygenerować skrypt do uruchomienia na bieżąco ze wszystkim rozwiniętym w lokalu:

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

Czy możesz wyjaśnić, co dokładnie robi ten skrypt krok po kroku? Próbowałem go przetestować, ale ponieważ nie mam pojęcia, jakie zachowanie powinno być i nie dostaję tego zachowania, spodziewam się, że jest całkiem bezużyteczny – Gullydwarf

+0

@Gullydwarf Ten skrypt nie jest kompletnym lub samodzielnym przykładem.Po prostu ilustruje strukturę syntaktyczną do rozszerzania zmiennych w tekście przed podaniem jej do qsub. –

+0

Czy mógłbyś go rozwinąć? Myślę, że to może być właśnie to, czego potrzebuję, aby rozszerzyć zmienny czas pracy dla mojej pracy. Nie ma opcji, jak -o dla czasu na ścianie w qsub jest tam? To by było o wiele łatwiejsze: p Edycja: Myślę, że znalazłem to, -l może być również użyte jako opcja do qsub, gdzie myślę, że mogę przejść przez ścianę. Testowanie teraz – Gullydwarf

0

się być nieco bardziej SGE specyficzny niż zaakceptowanej odpowiedzi, po prostu przekierować standardowe wyjście qsub i przeanalizuj identyfikator zadania. Następnie możesz użyć tej opcji, aby zmienić nazwę zadania poprzez qalter.

Oto przykład skryptu, którego użyłem do przesłania i zmodyfikowania takich zadań.

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 

Jestem pewien, że istnieją bardziej idiomatyczne sposoby, aby to zrobić, ale to jest pierwsze podejście.

Takie podejście pozwala submission_script na posiadanie własnych argumentów. Pozwala także programowo zmieniać inne cechy pracy, a nie tylko nazwę.

-2

Używam również polecenia qsub w SGE do generowania różnych raportów wyjściowych lub błędów. Na przykład, jeśli chciałbym obejmują TASK_ID w skrypcie, zamiast robić

#$ -o run_${TASK_ID}.out 

zapisać go bez paretheses rade:

#$ -o run_$TASK_ID.out 
+0

Nie, to nie działa. Otrzymasz plik o nazwie run_ $ TASK_ID.out, zmienna nie zostanie zastąpiona przez jej wartość – matthieu