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 dizerdash
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
porbash
. 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 defile.sh
ou./file.sh
(consulte suas próprias respostas )
$ ./script.sh
sh
não ' não permite a substituição de comandos. Tente invocar porbash script.sh
. A mesma chamada por./script.sh
é executada comsha-bang
que é / bin / ** bash ** em seu script.