ฉันมีฟังก์ชันแบบเรียกซ้ำต่อไปนี้เพื่อตั้งค่าตัวแปรสภาพแวดล้อม:
function par_set {
  PAR=$1
  VAL=$2
  if [ "" != "$1" ]
  then
    export ${PAR}=${VAL}
    echo ${PAR}=${VAL}
    shift
    shift
    par_set $*
  fi
}ถ้าฉันเรียกมันด้วยตัวมันเองมันจะตั้งค่าตัวแปรและ echoes เป็น 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 =เหตุใดท่อจึงป้องกันไม่ให้ฟังก์ชันส่งออกตัวแปร มีวิธีแก้ไขโดยไม่หันไปใช้ไฟล์ temp หรือไพพ์ที่มีชื่อหรือไม่?
การแก้ไข:
รหัสการทำงานต้องขอบคุณ 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โครงการโฮสต์บน bitbucket https://bitbucket.org/adalby/monitor-bashหากสนใจในรหัสเต็ม