ファイルの環境変数でenvを使用する

ファイルの環境変数でenvを使用する

e次の内容を含むファイル(名前が指定されている)があるとします。

a=3
b="5 6"

それぞれを別々のパラメータとして解釈するにはどうすればよいですかenv?つまり、次のようになります。

$ env a=3 b="5 6" ruby​​​ -e 'p ENV["a"] p ENV["b"]'
「サム」
「5 6」
$ env a=3 "b=5 6" ruby​​​ -e 'p ENV["a"] p ENV["b"]'
「サム」
「5 6」

これは明らかに空間上の理由で機能しません。

env $(cat e) ruby -e 'p ENV["a"]; p ENV["b"]'

しかし、これも同じです:

IFS=$'\n' env $(cat e) ruby -e 'p ENV["a"]; p ENV["b"]'

引用すると、次の$(cat e)ような結果が得られます。

"1\nb=2 3"
若い

答え1

これは、作業に適したツールを使用していない例です。 env環境変数を設定してから他のプログラムをチェーンロードする唯一のツールではありません。そして、ファイルから変数データを読みません。

もちろん、.akasourceコマンドも作業に適したツールではありません。

  1. ファイルに誤ってシェルコマンドを含めることができます。外の単純な変数割り当ては、場合によっては(構成ファイルが何であるかに応じて)大きなセキュリティホールになることがあります。
  2. 質問の例にある一連の作業は、.set で提供されます。シェル変数、いいえ環境変わりやすい。自動的にエクスポートされません。

正しいツールは、このタイプの複数のツールセットに含まれる一般的なチェーンローディングツールです。

その一つはread-conf出身です。Noshツールセット、これらの設定ファイル(例:/etc/rc.conf- 言うなら - PC-BSD)と環境変数の設定いいえ構成の実装と開示データフルシェル言語構文のファイル:

jdebp% 名前なし
Linux
idebp% ディレクトリ e
a=3
b="5 6"
jdebp%read-conf e printenv | jdebp%read-conf e printenv |
ユーザー=jdebp
a=3
b=5 6
ジェッドBP%
jdebp% 名前なし
FreeBSD
jdebp% read-conf /etc/rc.conf printenv | jdebp % read-conf /etc/rc.conf ヘッダ -n 2
cron_enable=いいえ
sendmail_msp_queue_enable=いいえ
ジェッドBP%

もう一つのツールはWayne Marshallのツールです。runenv犯罪者から。

答え2

ここでは必要ありませんenv。 Bourneに似たシェル(ファイルのsh構文が例に似ていると仮定):

(set -a; . ./e && ruby -e 'p ENV["a"]; p ENV["b"]')

set -a今後のすべての変数割り当てを環境にエクスポートします。)

次のようにすることもできます。

cat e - << 'EOF' | paste -sd ' ' - | sh
ruby -e 'p ENV["a"]; p ENV["b"]'
EOF

つまり、eファイルのすべての行とRubyコマンドラインを連結して、解釈用の1つのsh長いコマンドラインを作成します(まだeファイルのsh構文が二重引用符が提案するのと同じであると仮定します)。割り当てが単一行であると仮定します。

関連情報