it-swarm-ja.com

このbashスクリプトがUbuntuでエラーを出すのにOSXではエラーを出さないのはなぜですか

#!/usr/bin/env sh
export $NODE_CONFIG_DIR=/Users/full/path/to/script/config
cd /Users/full/path/to/script
/usr/local/bin/node main

スクリプトはOSXでローカルに実行されますが(ローカル環境のパスを調整した場合)、Ubuntuでは次のようになります。

./mtf_runner.sh: 2: export: : bad variable name

Cronを使用してスクリプトを実行したいので、NODE_CONFIG_DIR環境変数を設定する必要があります

さらに、コマンドはOSX(10.8.5)のcronで実行されますが、ローカルメールに次のように送信されます。

line 2: export: `=/Users/myname/Node/Development/tennistracker/config': not a valid identifier

これは=の周りのスペースが原因である可能性があることを読みましたが、間違いなくスペースがありません

1
codecowboy

これは、変数を設定するときに、接頭辞$を付けないようにする必要があるためです。ここで、$ NODE_CONFIG_DIRは、行を実行する前に(設定されていないため)何にも展開されないため、export =/Users/full/path/to/script/configを実行できます。スクリプトは次のようになります

#!/usr/bin/env sh
export NODE_CONFIG_DIR=/Users/full/path/to/script/config
cd /Users/full/path/to/script
/usr/local/bin/node main
4
user2313067

変数プレフィックスとして「$」を回避する使用法は正しいですが、別の違いがあります。 OSXシステムでは、「sh」は「bash」です。つまり、ボーンタイプのシェルです。これは、Macで次の操作を行うだけで確認できます。

man sh

Ubuntuでは、「sh」は「ダッシュ」です。ダッシュはコーンタイプのシェルです。これは、「man」ページまたは次の手順で確認することもできます。

ls -al /bin/sh

したがって、スクリプトが両方のシステムで同じように動作することを確認する場合は、次のようにします。

#!/usr/bin/env bash

通常の「sh」の代わりに。

0
JoeG