Por que esse script bash dá 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

Eu quero executar o script usando cron e preciso definir a variável de ambiente NODE_CONFIG_DIR

Além disso, embora o comando seja executado em cron no OSX (10.8.5), eu 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 em torno de = , mas definitivamente não há espaço

    
por codecowboy 02.02.2014 / 09:36

2 respostas

4

Isso é causado pelo fato de que, ao definir uma variável, você não deve prefixar com $. Aqui, o $ NODE_CONFIG_DIR é expandido em nada (como está desfeito) 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
    
por 02.02.2014 / 10:05
0

Embora o uso de evitar "$" como um prefixo 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 simplesmente fazendo uma

man sh

No Ubuntu, 'sh' é 'traço'. Dash é um shell do tipo Korn. Você também pode ver isso através da página "man" ou fazendo:

ls -al /bin/sh

Portanto, se você quiser garantir que seus scripts atuem da mesma maneira em ambos os sistemas, faça um:

#!/usr/bin/env bash

em vez do normal 'sh'.

    
por 28.12.2015 / 14:30