O comando é executado a partir do shell, mas não é executado a partir de um script.sh

1

Eu tento fazer um join de duas fontes - de um pipe e um arquivo. Eu escrevi este simples one-liner:

FILENAME=$TMPDIR".netstat"; \
join -t , $FILENAME <(nettop -t wifi -P -x -L1 | cut -d , -f 2,5,6 | tail -n +2) | \
awk '{print $0}'

Normalmente é executado a partir do shell, mas não é executado a partir de um script.sh (script completo, veja abaixo):

./script.sh: line 16: syntax error near unexpected token '('

Eu tentei usar diferentes citações dentro da minha expressão para mascarar variáveis, parâmetros ou comandos completamente, mas não consegui executar o script.

Alguém pode ajudar?

S. Este script está sendo invocado pelo GeekTool (widget Shell) no macOS Sierra 10.12.3.

P.P.S. Sim, sei que o OS X não é "Unix e Linux", mas achei que a diferença não é tão grande.

Script completo com alguns comentários é:

#!/bin/sh

FILENAME=$TMPDIR".netstat"

# checking if existing stats file
if [ ! -f $FILENAME ]; then
    nettop -t wifi -P -x -L 1 | cut -d , -f 2,5,6 | tail -n +2 > $FILENAME # save stats to file
    exit
fi

fts='stat -r $FILENAME | cut  -d " " -f 10' # get timestamp of stats file
now='date +%s'    # get current datetime

join -t, $FILENAME <(nettop -t wifi -P -x -L1 | cut -d , -f 2,5,6 | tail -n +2) | awk '{print $0}'

ATUALIZADO RESOLVIDO

Shebang mudou para #!/bin/bash

    
por user2962151 26.03.2017 / 23:43

2 respostas

15

Quase certamente isso está acontecendo porque o shell que você está usando para executar o script não é o mesmo que o seu shell interativo.

Como a linha shebang é #!/bin/sh , seu script é executado pelo intérprete /bin/sh . Em distros como o Ubuntu, /bin/sh é o shell dash, que não suporta todos os recursos do bash, como a substituição de processos (que <() bit).

A solução chama o script com /path/to/bash /path/to/script ou corrige a linha shebang ( #!/path/to/bash ).

    
por 26.03.2017 / 23:50
5

O script está utilizando um recurso específico do bash, substituição de processo , indicado pela sintaxe <(...) . (Consulte também o Guia avançado de script de script ).

Para eliminar o bashism você pode reorganizar a linha problemática de:

join -t, $FILENAME <(nettop -t wifi -P -x -L1 | cut -d , -f 2,5,6 | tail -n +2)

para:

nettop -t wifi -P -x -L1 | cut -d , -f 2,5,6 | tail -n +2 | join -t, $FILENAME -

que eliminaria esse erro ao executá-lo com / bin / sh.

    
por 27.03.2017 / 08:59