2013-02-05 25 views
7

Có thể mở rộng các biến trong các nhận xét bên trong tập lệnh bash không?Mở rộng thay đổi trong các nhận xét

Tôi muốn viết tập lệnh để nạp vào SGE. Cú pháp qsub cho phép tôi chuyển các tham số bổ sung cho công cụ lưới bằng cách sử dụng các dòng bên trong tập lệnh bash bắt đầu bằng #$. Ví dụ,

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

Những gì tôi muốn là các tham số -o là tự động thiết lập để một biến, nói $1. Vì vậy, tôi ngây thơ sẽ viết

#$ -o run_${1}.out 

Tuy nhiên, kể từ khi dòng bắt đầu với một #, bash bỏ qua nó và biến $1 không được mở rộng.

Bất kỳ ý tưởng nào? Một số tiền xử lý bash? Một số cách khác?

EDIT Tôi vừa chọn $1 làm ví dụ. Nó cũng có thể là $FOO hoặc $BAR.

+0

gì là xác định giá trị của $ {1 }? Bạn có đang thực hiện một chu trình để tải các công việc khác nhau trên cụm/lưới không? –

+0

vâng, đúng vậy. –

+2

Trong trường hợp đó, bạn có thể chỉ cần gọi qsub với tùy chọn -o bên trong vòng lặp của bạn thay vì đặt # $ -o bên trong tập lệnh được đưa vào qsub. –

Trả lời

4

Mở rộng biến xảy ra trong bộ nhớ vỏ, nó không ảnh hưởng đến tệp. Vì vậy, nó không quan trọng những gì bash mở rộng.

Thay vào đó, bạn có thể có thể tạo ra các kịch bản được chạy một cách nhanh chóng, với tất cả mọi thứ mở rộng tại chỗ:

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

Bạn có thể giải thích chính xác những gì mà tập lệnh này thực hiện từng bước không? Tôi đã thử nghiệm nó nhưng như tôi không có ý tưởng những gì hành vi nên được và tôi không nhận được hành vi tôi mong đợi nó khá vô dụng – Gullydwarf

+0

@ Gullydwarf Kịch bản này không phải là một ví dụ hoàn chỉnh hoặc tự chứa.Nó chỉ minh họa một cấu trúc cú pháp để mở rộng các biến trong văn bản trước khi đưa nó vào qsub. –

+0

Bạn có thể mở rộng không? Tôi nghĩ rằng điều này có thể là những gì tôi đang tìm kiếm để mở rộng một walltime biến cho công việc của tôi. Không có lựa chọn nào như -o cho giờ tường trong qsub? Điều đó sẽ làm cho nó dễ dàng hơn nhiều: p Chỉnh sửa: Tôi nghĩ rằng tôi đã tìm thấy nó, -l cũng có thể được sử dụng làm tùy chọn để qsub, nơi tôi nghĩ rằng tôi có thể vượt qua thời gian. Kiểm tra ngay bây giờ – Gullydwarf

0

Để có nhiều hơn một chút SGE cụ thể hơn câu trả lời được chấp nhận, chỉ cần chuyển hướng đầu ra tiêu chuẩn qsub và phân tích cú pháp id công việc. Sau đó, bạn có thể sử dụng quyền này để thay đổi tên công việc qua qalter.

Đây là mẫu của tập lệnh tôi đã sử dụng để gửi và sửa đổi các công việc như thế này.

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 

Tôi chắc chắn rằng có nhiều cách thành ngữ hơn để thực hiện việc này, nhưng đây là lần đầu tiên.

Cách tiếp cận này cho phép submission_script có đối số riêng. Nó cũng cho phép bạn lập trình thay đổi các đặc điểm công việc khác, không chỉ là tên.

-2

Tôi cũng đang sử dụng lệnh qsub trong SGE để tạo các bản ghi đầu ra hoặc lỗi khác nhau. Ví dụ, nếu tôi muốn bao gồm các TASK_ID trong kịch bản, thay vì làm

#$ -o run_${TASK_ID}.out 

Viết nó mà không có sự paretheses sẽ làm các trick:

#$ -o run_$TASK_ID.out 
+0

Không, nó không thực hiện thủ thuật. Bạn nhận được một tệp có tên run_ $ TASK_ID.out, biến không được thay thế bằng giá trị của nó – matthieu

Các vấn đề liên quan