Por que esse script bash fornece um erro no Ubuntu, mas não no OSX

1
#!/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

O script é executado localmente no OSX (se eu ajustar os caminhos para o ambiente local), mas no Ubuntu eu recebo:

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

Quero executar o script usando cron e preciso definir a NODE_CONFIG_DIRvariável de ambiente

Além disso, embora o comando seja executado no cronOSX (10.8.5), recebo o seguinte no meu email local:

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

Eu li que isso pode ser causado por um espaço ao redor, =mas definitivamente não há espaço

codecowboy
fonte
Um script que especifica #!/usr/bin/env shcomo seu interpretador de scripts não é um script bash , nem no Ubuntu , nem no Debian , nem no NetBSD .
JdeBP

Respostas:

4

Isso é causado pelo fato de que, ao definir uma variável, você não deve prefixá-la com $. Aqui, o $ NODE_CONFIG_DIR é expandido para nada (como não está definido) antes de executar a linha, o que faz você executar export =/Users/full/path/to/script/config. O script deve ser

#!/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
user2313067
fonte
0

Embora o uso de evitar "$" como prefixo de variável esteja correto, há outra diferença. Nos sistemas OSX, 'sh' é 'bash'. Ou seja, é um shell do tipo Bourne. Isso pode ser verificado no Mac, basta fazer um

man sh

No Ubuntu, 'sh' é 'dash'. Dash é um shell do tipo Korn. Você também pode ver isso na página 'man' ou fazendo:

ls -al /bin/sh

Portanto, se você deseja garantir que seus scripts ajam da mesma forma nos dois sistemas, faça um:

#!/usr/bin/env bash

em vez do 'sh' normal.

JoeG
fonte