2010-08-04 4 views
3

config 파일을 읽으려고 시도하고 configs의 "섹션"을 bash 스크립트의 어레이에 배치 한 다음 명령을 실행하려고합니다. 그 다음 configs를 통해 다시 보내고 config 파일의 끝까지이 작업을 계속하십시오.
scriptname -p $PORT -u $USER -P $PATH -o $OPTIONSBASH - 동일한 "변수"의 여러 인스턴스로 구성 파일을 읽습니다.

:

 
PORT="5000" 
USER="nobody" 
PATH="1" 
OPTIONS="" 

PORT="5001" 
USER="nobody" 
PATH="1" 
OPTIONS="" 

PORT="5002" 
USER="nobody" 
PATH="1" 
OPTIONS="" 

내가 bash는 스크립트가 첫 번째 ""절에서 읽은 스크립트에 가져, 다음을 실행하려면 : 여기

은 샘플 설정 파일입니다

config 파일에 몇 개의 "섹션"이 있는지에 따라 "섹션"을 반복적으로 실행하고 해당 구성 설정으로 명령을 실행하여 최종 명령. 그것은 위의 config 파일에서 읽을 수 있었다 그래서 만약, 출력은 다음과 같습니다

 
scriptname -p $PORT -u $USER -P $PATH -o $OPTIONS 
scriptname -p $PORT -u $USER -P $PATH -o $OPTIONS 
scriptname -p $PORT -u $USER -P $PATH -o $OPTIONS 

가 어느 차례로과 같습니다 사전에

 
scriptname -p 5000 -u nobody -P 1 -o "" 
scriptname -p 5001 -u nobody -P 1 -o "" 
scriptname -p 5002 -u nobody -P 1 -o "" 

감사합니다. 마지막에

function runscript() { 
    nohup scriptname -p $PORT -u $USER -P $PATH -o $OPTIONS &> /dev/null & 
} 

& 그들이 백그라운드에서 실행하게하고 nohup은 아니에요 보장 : 동시에 백그라운드에서 스크립트를 실행하려면

+2

는, 자신에게 부탁을하고 공백이 아닌 다른 뭔가를 가지고있는 논리 블록의 경계를 . – msw

+0

지금은 공백 블록이해야 할 일입니다. 이는 기본적으로 다른 응용 프로그램의 수정 사항입니다. 일시적이지만 빠른 수정이 필요합니다. 이 스크립트를 init 스크립트에 구현해야합니다. 설정 파일은 간단해야합니다. – drewrockshard

답변

3
#!/bin/bash 

if [[ $# -ne 1 ]]; then 
    echo "Usage: $0 script.cfg" >&2 
    exit 1 
fi 

function runscript() { 
    scriptname -p $PORT -u $USER -P $PATH -o $OPTIONS 
} 

while read LINE; do 
    if [[ -n $LINE ]]; then 
     declare "$LINE" 
    else 
     runscript 
    fi 
done < "$1" 

runscript 

이 시도 껍데기가 나올 때 죽는다. 그물 효과는 스크립트를 데몬으로 변환하여 상위 스크립트에 어떤 영향을 미치는지에 관계없이 백그라운드에서 계속 실행됩니다. 섹션 사이에 하나의 빈 줄이 가정

+0

사실이 스크립트를 시작 스크립트로 구현하려고합니다. 그러나 작동하지만 스크립트 이름 스탠자의 인스턴스 하나만 실행합니다. while 루프를 설정 파일에서 읽도록 변경했습니다. 내가 말했듯이, 내 개조는 작동하지만, 단지 하나의 프로그램 만 시작하고 다른 프로그램은 시작하지 않습니다. – drewrockshard

+0

스크립트가 한 번만 호출 된 다음 종료되거나 스크립트가 종료되지 않아 스크립트와 블록을 호출한다는 것을 의미합니까? 후자 인 경우 수용 할 수있는 답변을 편집했습니다. 이전 버전의 경우 작동하지 않는 기능에 대한 추가 정보가 필요합니다. 스크립트는 샘플 구성 파일로 테스트했을 때 작동했습니다. –

+1

'eval'을'declare'로 변경해야합니다. 'declare'가 피할 수있는'eval'은 보안 위험이 있습니다. (이 경우 입력 파일은 아마 안전 할 것이지만, 변경하는 것이 좋은 습관입니다). 로직을 약간 변경해야합니다.'[[-z $ LINE]] && runscript ||와 같은 것입니다. "$ LINE"을 선언하십시오. –

0

이 당신의 자신의 디자인의 미니 언어처럼 보인다 이후

cat <yourfile> | while read ; do 
    if [ -z "$REPLY" ] ; then 
     scriptname -p $PORT -u $USER -P $PATH -o "$OPTIONS" 
    else 
     eval "$REPLY" # NOTE: eval is evil 
    fi 
done 
+0

그래서'eval'을'declare'로 변경해야합니다 - 그것은 효과적이고 안전합니다. 아, 고양이는 불필요합니다. 'done

+0

선언문에 대한 메모를 보내 주셔서 감사합니다. RE : 고양이 - 오래된 습관이 힘들어 죽는다. :) –

2
#!/bin/bash 

awk 'BEGIN{ FS="\n";RS=""} 
{ 
    for(i=1;i<=NF;i++){ 
    gsub(/.[^=]*=|\042/,"",$i) 
    } 
    print "scriptname -p "$1" -u "$2" -P "$3" -o "$4 
}' file | bash 
+0

그것은 좋은 해결책입니다. 실제로'print'를'system'으로 대체하고'| bash'. – Gilles

+0

예. 그 또 다른 방법은 많이 제공하지 않습니다. Xargs와 bash에 대한 파이핑이 system()을 호출하는 것보다 낫습니다. – ghostdog74

관련 문제