私はこのようなbashスクリプトを持っています
# print.sh
# export FOO=test would work too
FOO=test ./foo-proj # Something that cares about FOO (shell script or just a binary)
これはうまくいきます。しかし、なぜこれを行うのか知りたいのですが…
#print.sh
blah="FOO=test"
$blah ./foo-proj
このエラーが発生します./print.sh: line 2: FOO=test: command not found
。 bashと同様に、FOO=test
変数宣言の代わりにコマンドを解釈します。この問題を解決する方法はありますか?
ベストアンサー1
いくつかのオプション:
env -- "$blah" ./foo-proj
env は./foo-proj
環境でオブジェクトを呼び出します。$blah
この場合、変数名が有効なシェル変数名に制限されないという利点があります。たとえば、有効なシェル変数名でない場合は、「even」という環境変数をblah='+++=xxx'
渡す必要があるかもしれません。+++
+++
(export -- "$blah"; exec ./foo-proj)
または:
eval " $blah ./foo-proj"
whereはeval
引数として渡され、" FOO=test ./foo-proj"
文字列はシェルコードとして評価されます(ここでは=
リテラルなので、割り当てと見なされます)。
$blah
ただし、この場合はblah='FOO=test;reboot;'
再開されますのでご注意ください。