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
コマンドも作業に適したツールではありません。
- ファイルに誤ってシェルコマンドを含めることができます。外の単純な変数割り当ては、場合によっては(構成ファイルが何であるかに応じて)大きなセキュリティホールになることがあります。
- 質問の例にある一連の作業は、
.
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
構文が二重引用符が提案するのと同じであると仮定します)。割り当てが単一行であると仮定します。