eh:…:não é um identificador ao tentar invocar scripts de shell usando plink
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
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 já 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.