tmp.txt
エクスポートする変数を含むファイルがあります。たとえば、次のようになります。
a=123
b="hello world"
c="one more variable"
export
後で子プロセスで使用できるようにコマンドを使用してこれらすべての変数をエクスポートするにはどうすればよいですか?
答え1
set -a
. ./tmp.txt
set +a
set -a
これから定義された変数を自動的にエクスポートするようにします。 Bourneに似たすべてのシェルで使用できます。.
はコマンドの標準とBourne名なsource
ので、移植性のために好みます(時々少し異なる動作を含む)を含むsource
ほとんどcsh
の現代のBourne様シェルで利用可能です。bash
POSIXシェルでは、set -o allexport
より説明的な代替(set +o allexport
unset)を使用して作成することもできます。
以下を使用して関数にすることができます。
export_from() {
# local is not a standard command but is pretty common. It's needed here
# for this code to be re-entrant (for the case where sourced files to
# call export_from). We still use _export_from_ prefix to namespace
# those variables to reduce the risk of those variables being some of
# those exported by the sourced file.
local _export_from_ret _export_from_restore _export_from_file
_export_from_ret=0
# record current state of the allexport option. Some shells (ksh93/zsh)
# have support for local scope for options, but there's no standard
# equivalent.
case $- in
(*a*) _export_from_restore=;;
(*) _export_from_restore='set +a';;
esac
for _export_from_file do
# using the command prefix removes the "special" attribute of the "."
# command so that it doesn't exit the shell when failing.
command . "$_export_from_file" || _export_from_ret="$?"
done
eval "$_export_from_restore"
return "$_export_from_ret"
}
¹in bash
、これはすべての問題を引き起こすことに注意してください。機能whileステートメントallexport
は環境にエクスポートされます(実行中でも、BASH_FUNC_myfunction%%
その環境で実行されているすべてのシェルがその後に環境変数を取得します)。bash
sh
答え2
source tmp.txt
export a b c
./child ...
別の質問で判断すると、変数名をハードコーディングしたくありません。
source tmp.txt
export $(cut -d= -f1 tmp.txt)
テストを受けてください:
$ source tmp.txt
$ echo "$a $b $c"
123 hello world one more variable
$ perl -E 'say "@ENV{qw(a b c)}"'
$ export $(cut -d= -f1 tmp.txt)
$ perl -E 'say "@ENV{qw(a b c)}"'
123 hello world one more variable
答え3
ㅏ危険ソースコードを必要としない1行のコード:
export $(xargs <file)
- 環境ファイルでよく使用されるコメントは処理できません。
- 質問の例のように、スペースを含む値は処理できません。
- 一致する場合は、誤ってグローバルパターンをファイルに拡張できます。
これはbash拡張を介して行を渡すので、少し危険ですが、安全な環境ファイルがあることを知っていると機能します。
答え4
@Stéphane Chazelasの優れた回答に追加するには、次のようにファイル内のset -a
/およびそのエントリ(例: "to_export.bash")を使用することもできます。set +a
#!/usr/bin/env bash
set -a
SOMEVAR_A="abcd"
SOMEVAR_B="efgh"
SOMEVAR_C=123456
set +a
...その後、ファイルに含まれるすべての変数を次のようにエクスポートします。
. ./to_export.bash
...または...
source ./to_export.bash
ありがとうございます!