次の環境変数を使用してコマンドを実行できることがわかります。
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