3

問題:

シェルスクリプトをrubyスクリプトのサブプロセスとして実行しています。スクリプトを実行した後、配列変数を含むシェルのすべての環境変数をチェックするオプションが必要です。

これまでのところ私は思いついた:

set | awk -F= 'BEGIN            {v=0;}
  /^[a-zA-Z_][a-zA-Z0-9_]*=/    {v=1;}
  v==1 && $2~/^['\''\$]/        {v=2;}
  v==1 && $2~/^\(/              {v=3;}
  v==2 && /'\''$/ && !/'\'\''$/ {v=1;}
  v==3 && /\)$/                 {v=1;}
  v                             {print;}
  v==1                          {v=0;}
'

これは、配列、複数行の文字列、フィルターアウト関数などの変数のみを示しています。

ただし、これは常に同じ形式を使用するわけではありません。特に、配列変数はBASHとZSHで異なって表されます。

これが私の現在の実装です:https ://github.com/mpapis/tf/blob/master/lib/tf/environment.rb

質問:

BASHおよびZSH/場合によっては他のシェルで永続的に機能するすべての変数を表示する簡単な方法はありますか?

4

2 に答える 2

7

また会えてうれしいmpapis;-)

残念ながら、配列と連想配列はPOSIX.1-2008の対象外であり、ご存知のように、との間にはいくつかの厄介な微妙な違いがbashありzshます。したがって、すべてのPOSIXシェルでこれを行う単一の方法はありません$BASH_VERSION。すでに述べたように、チェックなどを行う必要があります。

set私は、または他のshell組み込みの出力を解析するためにRubyを作成する必要がない方がよいと判断しました。出力は解析するのに便利ではなく、とにかくシェルはそれ自体のデータについて最もよく知っているので、ほとんどのインテリジェンスをシェルコード内に置くことは理にかなっていると思いました。その代わりに、シェルコードを使用してデータ構造をYAMLとして出力し、そのYAMLをRubyに直接ロードするソリューションを考え出しました。

まず、リファレンス実装とテストをスタンドアロンリポジトリのmasterブランチにインポートしました。次に、テストスイートを強化し、いくつかの調整を行いました。これは、複数行の処理にまだ問題があることを示しています。

次に、新しいyamlブランチを作成し、独自の実装を開発しました。もう一度、テストを拡張しました。それらはすべて合格です;-)内省を行うためにいくつかの異なるトリックを使用していることに注意してzshくださいbash

  • zshzsh/parameterすべてのパラメータの名前とタイプを含む連想配列を提供するモジュールがあります。
  • bashdeclare -p簡単に解析できる形式になっています。もありますcompgen -A variableが、結局これは使いませんでした。

kshサポートを追加するのも簡単だと思います。

于 2012-08-18T19:18:16.780 に答える
1

set環境変数ではなく、すべてのシェル変数を返します。環境変数を取得するには、envコマンドを使用します。bashは配列を環境にエクスポートしないことに注意してください。

于 2012-08-14T16:47:15.607 に答える