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
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 dizerdashexatamente.file $(which sh)output/bin/sh: symbolic link to 'dash' - Costas, que ' é o que eu significou. Michael Durrant mudou minha edição para substituir
dashporbash. 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.shem vez defile.shou./file.sh(consulte suas próprias respostas )
$ ./script.shshnão ' não permite a substituição de comandos. Tente invocar porbash script.sh. A mesma chamada por./script.shé executada comsha-bangque é / bin / ** bash ** em seu script.