환경 변수를 설정하는 다음과 같은 재귀 함수가 있습니다.
function par_set {
PAR=$1
VAL=$2
if [ "" != "$1" ]
then
export ${PAR}=${VAL}
echo ${PAR}=${VAL}
shift
shift
par_set $*
fi
}
스스로 호출하면 변수를 설정하고 stdout으로 에코합니다.
$ par_set FN WORKS
FN=WORKS
$ echo "FN = "$FN
FN = WORKS
stdout을 파일로 리디렉션하면 작동합니다.
$ par_set REDIR WORKS > out
cat out
REDIR=WORKS
$ echo "REDIR = "$REDIR
REDIR = WORKS
그러나 stdout을 다른 명령으로 파이프하면 변수가 설정되지 않습니다.
$ par_set PIPE FAILS |sed -e's/FAILS/BARFS/'
PIPE=BARFS
$ echo "PIPE = "$PIPE
PIPE =
파이프가 함수가 변수를 내 보내지 못하게하는 이유는 무엇입니까? 임시 파일이나 명명 된 파이프에 의존하지 않고이 문제를 해결할 수있는 방법이 있습니까?
해결 :
Gilles 덕분에 작업 코드 :
par_set $(echo $*|tr '=' ' ') > >(sed -e's/^/ /' >> ${LOG})
이를 통해 스크립트를 다음과 같이 호출 할 수 있습니다.
$ . ./script.sh PROCESS_SUB ROCKS PIPELINES=NOGOOD
$ echo $PROCESS_SUB
ROCKS
$ echo $PIPELINES
NOGOOD
$ cat log
7:20140606155622162731431:script.sh:29581:Parse Command Line parameters. Params must be in matched pairs separated by one or more '=' or ' '.
PROCESS_SUB=ROCKS
PIPELINES=NOGOOD
전체 코드에 관심이있는 경우 비트 버킷 https://bitbucket.org/adalby/monitor-bash 에서 호스팅되는 프로젝트 .