Definição da função de impressão POSIX

3

Bash pode imprimir uma definição de função:

$ bash -c 'y(){ echo z; }; export -f y; export -f'
y ()
{
    echo z
}
declare -fx y

No entanto, isso falha no POSIX Bash, / bin / sh e / bin / traço :

$ bash --posix -c 'y(){ echo z; }; export -f y; export -f'
export -f y

Uma definição de função pode ser impressa sob um shell POSIX?

    
por Steven Penny 08.03.2016 / 03:43

2 respostas

3

Você não pode portá-lo. A especificação POSIX não especificou nenhuma maneira de despejar a definição de função, nem como as funções são implementadas.

Em bash , você não precisa exportar a função para o ambiente, você pode usar:

declare -f funcname

(Trabalhar em zsh )

Isso funciona mesmo quando você executa bash no modo posix :

$ bash --posix -c 'y(){ echo z; }; declare -f y'
y () 
{ 
    echo z
}

Em ksh :

typeset -f funcname

(Funciona em bash , zsh , mksh , pdksh , lksh )

Em yash :

typeset -fp funcname

Isso não funcionará se yash entrar modo POSIXly-correto :

$ yash -o posixly-correct -c 'y() { ehco z; }; typeset -fp y'
yash: no such command 'typeset'

com zsh :

print -rl -- $functions[funcname]
whence -f funcname
type -f funcname
which funcname

Observe que whence -f , which , type -f reportará o alias primeiro com o mesmo nome. Você pode usar -a para fazer zsh relatar todas as definições.

POSIXly, você teria que gravar sua definição de função que você poderia fazer com:

myfunction_code='myfunction() { echo Hello World; }'
eval "$myfunction_code"

ou uma função auxiliar

defn() {
  code=$(cat)
  eval "${1}_code=\$code; $1() { $code; }"
}

defn myfunction << 'EOF'
echo Hello World
EOF

printf '%s\n' "$myfunction_code"
    
por 08.03.2016 / 05:03
1

Não. Pelo menos, não é do meu conhecimento.

-f é uma extensão da exportação POSIX .

POSIX set (e bash set no modo POSIX) também exclui definições de função.

    
por 08.03.2016 / 04:18