10

ここに最初の投稿がありましたが、何年もの間潜んでいました。私は何年もの間グーグルで検索しましたが、私が欲しいものを見つけることができません(トピックが示唆していることを要求しない多くの曖昧なトピックの主題...)。awkやスクリプトは初めてではなく、少し錆びています:)

実行時にシェル環境値を設定するawkスクリプトを作成しようとしています。別のbashスクリプトを取得して、後で使用できるようにします。awkからstdoutを使用して、設定したいこの値を報告することはできません(つまり、「exportwhatever = awk cmd here」)。これは、awkscriptが作成している「結果ファイル」にすでに送信されているためです(さらに、エクスポートする変数が複数あります。とにかく最終的なコード)。

テストスクリプトの例として、私の問題をデモするには:

echo $MYSCRIPT_RESULT          # returns nothing, not currently set
echo | awk -f scriptfile.awk   # do whatever, setting MYSCRIPT_RESULT as we go
echo $MYSCRIPT_RESULT          # desired: returns the env value set in scriptfile.awk 

scriptfile.awk内で、私は(成功せずに)試しました

1 /)アドホック文字列を直接構築して実行する:

{
  cmdline="export MYSCRIPT_RESULT=1"
  cmdline
}

2 /)システム機能の使用:

{
  cmdline="export MYSCRIPT_RESULT=1"
  system(cmdline)
}

...しかし、これらは機能しません。これらの2つのコマンドは、awkが実行しているシェル内にサブシェルを作成し、私が求めることを実行していると思われます(テストとしてファイルに触れることで証明されています)が、「cmd」/システムコールが完了すると、残念ながらサブシェルは停止します私が設定したものは何でも取ります-したがって、私のenv設定の変更は、「awkの呼び出し元」の観点からは固執しません。

だから私の質問は、 awkの実行が完了した後に呼び出しプロセスがこれらのenv値にアクセスできるように、実際にawk内でenv変数を直接設定するにはどうすればよいですか?それは実際に可能ですか?

私が失敗したことが証明された上記のアドホック/システムの方法を除いて、これがどのように行われるのかわかりません(これらの値を呼び出し元のスクリプトによって取得されて読み取られるように「ランダムな」ファイルに書き込む以外は)とにかくimoは少し汚れています)、したがって、助けてください!

すべてのアイデア/提案/コメントを歓迎します!

4

4 に答える 4

8

親プロセスの環境を変更することはできません。もしも

MYSCRIPT_RESULT=$(awk stuff)

受け入れられない、あなたが求めていることはできません。

于 2012-08-16T14:06:30.547 に答える
3

あなたはこれを行うことができますが、それは少し厄介です。ファイル記述子へのリダイレクトは許可されていないためawk、fifoまたは通常のファイルを使用できます。

$ mkfifo fifo
$ echo MYSCRIPT_RESULT=1 | awk '{ print > "fifo" }' &
$ IFS== read var value < fifo
$ eval export $var=$value

varとvalueを分割する必要はありません。同じように簡単にawkに「エクスポート」を出力させ、出力を直接評価することもできます。

于 2012-08-16T16:13:27.930 に答える
3

Set variable in current shell from awk で説明されているようなものを使用することもできます

 unset var
 var=99
 declare $( echo "foobar" | awk '/foo/ {tmp="17"} END {print "var="tmp}' )
 echo "var=$var"
var=

awk END 句は必須です。それ以外の場合は、パターンに一致するものがない場合、declare は現在の環境を stdout にダンプし、変数の内容を変更しません。

スペースで区切って複数の値を設定できます。

 declare a=1 b=2
 echo -e "a=$a\nb=$b"

注: 宣言は bash のみです。他のシェルでは、同じ構文で eval を使用します。

于 2015-11-17T12:06:23.210 に答える