解決済み:

解決済み:

環境変数を設定する次の再帰関数があります。

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

Bitbucketでホストされているプロジェクトhttps://bitbucket.org/adalby/monitor-bash完全なコードに興味がある場合。

ベストアンサー1

パイプの各部分(つまり、パイプの各側面)は、別々のプロセス(サブシェルと呼ばれる)で実行されます。フォークスクリプトの一部を実行する子プロセス)。では、実行パイプラインの左側にある子プロセスに変数が設定されますpar_set PIPE FAILS |sed -e's/FAILS/BARFS/'PIPEこの変更は親プロセスに反映されません。環境変数はプロセス間で渡されず、子プロセスからのみ継承されます。

パイプの左側は常にサブシェルで実行されます。一部のシェル(ATT ksh、zsh)は親シェルで右を実行し、ほとんどはサブシェルでも右を実行します。

スクリプトの一部の出力をリダイレクトし、親シェルでその部分を実行するには、ksh/bash/zsh で以下を使用できます。プロセスの交換

par_set PROCESS SUBSTITUTION > >(sed s/ION/ED/)

POSIXシェルを使用すると、出力を名前付きパイプにリダイレクトできます。

mkfifo f
<f grep NAMED= &
par_set NAMED PIPE >f

ああ、そしてあなたはいなくなりました。変数置換の引用、あなたのコードは、次の問題により中止されますpar_set name 'value with spaces' star '*'

export "${PAR}=${VAL}"
par_set "$@"

おすすめ記事