Pergunta

Abaixo está meu script de shell que estou tentando executar usando PLINK sobre MachineB de MachineA(Máquina Windows).

#!/bin/bash
export HIVE_OPTS="$HIVE_OPTS -hiveconf mapred.job.queue.name=hdmi-technology"
hive -S -e 'SELECT count(*) from testingtable1' > attachment22.txt

estou usando plink para executar o script shell como abaixo,

C:\PLINK>plink uname@MachineB -m test.sh
Using keyboard-interactive authentication.
Password:
Using keyboard-interactive authentication.
Your Kerberos password will expire in 73 days.

E este é o erro abaixo que sempre recebo sempre que tento executar como acima.

sh: HIVE_OPTS= -hiveconf mapred.job.queue.name=hdmi-technology: is not 
an identifier

Algo errado com meu script de shell?ou alguns espaços à direita?Eu não sou capaz de descobrir isso.eu estou correndo PLINK da máquina Windows

Foi útil?

Solução

O sh: prefixo na mensagem de erro indica que o script está sendo executado por sh, não bash.

bash permite combinar a configuração de uma variável e exportá-la em um único comando:

export foo=bar

sh, ou pelo menos algumas versões mais antigas dele, exigem que estas duas ações sejam separadas:

foo=bar ; export foo

Uma versão do sh que não reconhece o export foo=bar sintaxe irá interpretar a string foo=bar como nome de variável (e ilegal, pois não é um identificador).

Providencie para que o script seja executado pelo bash ou altere isto:

export HIVE_OPTS="$HIVE_OPTS -hiveconf mapred.job.queue.name=hdmi-technology"

para isso:

HIVE_OPTS="$HIVE_OPTS -hiveconf mapred.job.queue.name=hdmi-technology"
export HIVE_OPTS

Aliás, já que você está se referindo a $HIVE_OPTS logo no início do seu roteiro, é quase certo exportado, então você pode simplesmente descartar o export.

(Você também precisará evitar quaisquer outros recursos específicos do bash.)

Então, por que o sistema está invocando o shell com sh?O #!/bin/bash sintaxe é específico para sistemas do tipo Unix.O Windows geralmente decide como executar um script com base na extensão do arquivo;aparentemente seu sistema está configurado para invocar *.sh arquivos usando sh.(Você poderia configure seu sistema, usando Opções de pasta, para invocar *.sh arquivos usando bash, mas isso pode apresentar outros problemas.)

Outras dicas

Eu acho que o -m opção para plink serve para ler comandos a serem executados na máquina remota a partir de um local arquivo.Se meu comentário sobre finais de linha não funcionar, tente

plink uname@MachineB test.sh

Certificar-se test.sh é executável executando

chmod +x test.sh

na Máquina B.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top