サブシェルの環境変数の設定

サブシェルの環境変数の設定

次の環境変数を使用してコマンドを実行できることがわかります。

FOO=bar mycommand

次のようにサブシェルでコマンドを実行できることがわかります。

(firstcommand && secondcommand)

しかし、どういうわけかこの2つを組み合わせることができますか?

FOO=bar (firstcommand && secondcommand)

以下を提供します。

sh: syntax error: unexpected "("

少なくともBusiness Boxシェル(ash)では。

編集する:KusaranandaはFOO=bar sh -c 'first && second'これが実際に解決策であると提案します。しかし、私は引用符のエスケープを操作する必要がないので、サブシェル構文が好きなので、代替答えにも興味があります。

答え1

一方通行:

FOO=bar sh -c 'first && second'

これはFOO個々のコマンドのsh環境変数を設定します。

複数の環境変数を設定します。

FOO=bar BAZ=quux sh -c 'first && second'

export別の方法は、サブシェルの内部に変数を生成することです。サブシェル内でアクションを実行すると、exportシェルがその環境で変数を取得できなくなります。

( export FOO=bar; first && second )

export要約(現在削除済み)注:環境変数(シェル変数ではない)を作成する必要があります。環境変数の問題は、子プロセスによって継承されることです。firstおよびsecondその環境を表示する外部ユーティリティ(またはスクリプト)の場合は、存在しないFOO場合export

答え2

演算子を使用して、&&サブシェル宣言を環境変数代入文に連結します。

FOO=bar && (firstcommand && secondcommand)

たとえば、

GREETING='Hello' && ( echo "${GREETING}, friend!" )
# Hello, friend!

&&また、コマンドが使用される関連する問題を克服します。以前変数の値(変数がコマンドの接頭辞として新しい値を使用してオーバーライドされた場合):

GREETING='Halt'
GREETING='Hello' && echo "${GREETING}, friend!"
# Hello, friend!

いいえ&&:

GREETING='Halt'
GREETING='Hello' echo "${GREETING}, friend!"
# Halt, friend!
# OOPS!

答え3

宣言をサブシェルに入れることができます。

( export FOO=bar; firstcommand && secondcommand )

またはPOSIXly、

( export FOO; FOO=bar; firstcommand && secondcommand )

答え4

一般的なエクスポートの場合は、上のmakefileにこの行を追加してください。

SHELL:=NODE_PATH=. ${SHELL}

ここで "NODE_PATH="。 varの例です

このサンプルプロジェクトではこれを使用しています。

https://github.com/rzr/webthing-iotjs/blob/sandbox/rzr/node/master/Makefile#L24

関連情報