Algumas funções bash são executadas, mas não podem ser exportadas (nenhuma falha de 'exportação')

2

Eu testei isso:

~$ test() { echo foo |sed -r s/.*(.)/\1/g; }
~$ test
o

Até aí tudo bem. Mas então:

~$ export -f test
~$ bash -c ''
bash: test: line 0: syntax error near unexpected token '('
bash: test: line 0: 'test () {  echo foo | sed -r s/.*(.)/\1/g'
bash: error importing function definition for 'test'

Eu sei que usar citações com sed resolve o problema. Mas o bash não exportando uma função que é executada é alarmante e requer explicações, regras e casos.

Eu esperaria que o bash fosse capaz de lidar com suas próprias citações, então acho que isso só pode ser um bug.

    
por argle 08.02.2018 / 10:04

1 resposta

0

Suspeito que você tenha duas versões de bash em seu sistema e que, quando estiver chamando bash -c '' , esteja invocando uma versão diferente. Isso ou seu código foi alterado quando você criou a pergunta.

Quanto a por que eu acho isso, seu código não funciona no meu sistema:

$ test() { echo foo |sed -r s/.*(.)/\1/g; }
bash: syntax error near unexpected token '('

O problema é que você não tem aspas em torno da expressão sed , então o bash está tentando interpretá-lo como uma expressão shell. Eu estou supondo que este comportamento mudou entre as versões bash, e que o seu shell de login é uma versão diferente de bash do que o que está no seu $PATH ao chamar bash -c '' .
Você pode verificar isso fazendo:

$ echo $SHELL
$ which bash

Outra possível causa seria se você tivesse algumas opções de shell configuradas que estivessem alterando o comportamento da avaliação de expressão do bash, e essas opções não estão sendo usadas pelo bash -c '' .

Quanto a como corrigir o problema, quando eu cito corretamente a expressão sed , tudo funciona bem:

$ test() { echo foo | sed 's/.*\(.\)//g'; }
$ export -f test
$ bash -c 'test'
o

(Nota: eu tive que ajustar levemente o comando sed , pois não é um comando válido para a minha versão do sed )

    
por 08.02.2018 / 14:53