Como a definição de função pode fazer parte da seqüência de pipe na gramática de shell POSIX?

0

A gramática da shell POSIX no link

diz

pipe_sequence    :                             command
                 | pipe_sequence '|' linebreak command
                 ;
command          : simple_command
                 | compound_command
                 | compound_command redirect_list
                 | function_definition

o que significa que a definição de função pode ser um termo em uma seqüência de tubos. Como isso é possível? A definição da função não pode ter entrada ou saída padrão e não é um comando que pode ser executado. Apenas uma função chamada , que é um comando simples, pode ser executada.

Adicionado após o primeiro comentário e resposta:

Se dividirmos function_definition de command aqui e adicioná-lo como outra alternativa onde mais command aparecer, então sim, estamos complicando um pouco a gramática.

Mas a recompensa é muito mais importante: a implementação de tal shell é muito mais fácil.

Porque, se você permitir definições de função em um pipe, terá que lidar com questões como qual é o escopo da função e em qual ambiente ela é executada. Eu não acredito que tais perguntas sejam de fato respondidas na norma.

O que é pior: um pouco mais de complexidade na gramática, ou muito mais trabalho e complexidade para o implementador. Se o primeiro, então este não é um caso de "cauda abanando o cachorro"?

    
por user322908 29.06.2016 / 17:32

2 respostas

1

Na verdade, é mais fácil para o implementador não ter que se preocupar com isso. Ao fazer um pipe, cada componente é executado em seu próprio subshell (exceto talvez o primeiro no bash, ou o último no ksh88 / ksh93 se o comando for nativo). Assim, a definição da função no meio de um pipeline seria definida para a instância do shell para esse componente do pipe, mas não visível para fora ... e isso é tudo automático com base na semântica dos pipelines.

Se você quisesse evitar definições de funções (ou definições de alias, ou comandos tolos como cd ...) dentro de um pipeline, então você complicou a implementação: -)

    
por 29.06.2016 / 19:26
4

Por que não seria possível? É sem sentido? Definitivamente. Mas funciona:

$ function asdf { echo "bla"; } | hexdump -C; echo EOF
EOF

Da mesma forma:

$ function asdf { echo "bla"; } | asdf | hexdump -C; echo EOF
-bash: asdf: command not found
EOF

Definir uma função é um “comando” como qualquer outro. Ele não tem saída e não recebe nenhuma entrada. Você poderia até mesmo fazer uma atribuição variável. Sem sentido novamente, claro, mas não um erro.

O "porquê" é provavelmente: KISS. Você não gostaria de poluir sua gramática com complexidade desnecessária.

Atualização : Após um exame mais detalhado, descobri que o Bash nem se incomodou em executar os comandos do pipe após uma definição de função.

    
por 29.06.2016 / 17:50