erro de sintaxe próximo ao token inesperado `< '

Eu sou escrever um script para ler a saída de um comando para as variáveis a e b. Este é o script

#!/bin/bash read a b < <(awk "/Application Server/ && !seen[$7]++{printf "%s ", $7}" /tmp/ServerState) echo "The value of a is $a" echo "The value of b is $b" 

e obtendo o erro de sintaxe como:

line 3: syntax error near unexpected token `<" line 3: `read a b < <(awk /Application Server/ && !seen[$7]++{echo "%s ", $7} /tmp/ServerState)" 

Mas quando estou digitando o mesmo comando no console, ele está funcionando para mim sem nenhum problema.

app@user:/tmp> read a b < <(awk "/Application Server/ && !seen[$7]++{printf "%s ", $7}" /tmp/ServerState) app@user:/tmp> echo $a FAILED app@user:/tmp> echo $b STARTED 

Qualquer ajuda sobre isso é muito apreciada.

Comentários

  • Não consigo reproduzir este comportamento a partir do script. Como você está invocando o script? Estou invocando como: $ ./script.sh
  • @Ketan Estou invocando como sh script.sh. Agora mesmo tentei usar ./script.sh e está dando o resultado desejado. O valor de a é FAILED O valor de b é STARTED. Muito obrigado pela resposta … Só quero saber por que é diferente ao executar o mesmo script usando sh file.sh e ./file.sh ??
  • Suponha sh não ' não permite a substituição de comandos. Tente invocar por bash script.sh. A mesma chamada por ./script.sh é executada com sha-bang que é / bin / ** bash ** em seu script.
  • @SudevJash see: Qual é a diferença entre ./ e sh para executar um script?
  • @Costas Sim, está funcionando bem, mesmo com bash script.sh e estou obtendo a saída desejada … Muito obrigado …

Resposta

sh (que na maioria dos sistemas (derivados do Debian) está vinculado a dash) não permite substituição de processos . Tente invocar por bash script.sh. A mesma chamada por ./script.sh é executada com sha-bang que é /bin/bash em seu script.

Comentários

  • @MichaelDurrant Ah, sua modificação agora significa o oposto do que eu quis dizer.
  • @muru eu não posso ' não aceitar a modificação t o bash. Quero dizer dash exatamente. file $(which sh) output /bin/sh: symbolic link to 'dash'
  • Costas, que ' é o que eu significou. Michael Durrant mudou minha edição para substituir dash por bash. Obrigado por corrigir isso.
  • Você quer dizer substituição de processo (<( echo foo )), não substituição de comando ($(echo foo)) (que faz parte da especificação POSIX).
  • @chepner Você está certo. Obrigado por comentar. Reparado.

Resposta

Eu estava tentando invocar o script como sh file.sh e estava obtendo o erro . Mas quando invoquei o mesmo script que ./file.sh e bash file.sh, ele está funcionando e dando o resultado desejado.

Resposta

Além disso, você pode simplesmente adicionar a linha abaixo no topo do seu script:

#!/bin/bash 

Diz ao seu terminal / console para executar o script como script bash, e então a substituição do seu processo “<( cmd )” funcionará bem.

Comentários

  • Observe que o script do OP ' s já tinha esse shebang, mas o OP estava em execução como sh file.sh em vez de file.sh ou ./file.sh (consulte suas próprias respostas )

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *