Tôi có hàm đệ quy sau để đặt biến môi trường:
function par_set {
PAR=$1
VAL=$2
if [ "" != "$1" ]
then
export ${PAR}=${VAL}
echo ${PAR}=${VAL}
shift
shift
par_set $*
fi
}
Nếu tôi tự gọi nó, cả hai đều đặt biến và lặp lại thành thiết bị xuất chuẩn:
$ par_set FN WORKS
FN=WORKS
$ echo "FN = "$FN
FN = WORKS
Chuyển hướng stdout sang một tập tin cũng hoạt động:
$ par_set REDIR WORKS > out
cat out
REDIR=WORKS
$ echo "REDIR = "$REDIR
REDIR = WORKS
Nhưng, nếu tôi chuyển stdout sang lệnh khác, biến không được đặt:
$ par_set PIPE FAILS |sed -e's/FAILS/BARFS/'
PIPE=BARFS
$ echo "PIPE = "$PIPE
PIPE =
Tại sao đường ống ngăn chức năng xuất biến? Có cách nào để khắc phục điều này mà không cần dùng đến các tệp tạm thời hoặc các đường ống được đặt tên không?
Đã giải quyết:
Mã làm việc nhờ Gilles:
par_set $(echo $*|tr '=' ' ') > >(sed -e's/^/ /' >> ${LOG})
Điều này cho phép tập lệnh được gọi như vậy:
$ . ./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
Dự án được lưu trữ trên bitbucket https://bitbucket.org/adalby/monitor-bash nếu quan tâm đến mã đầy đủ.