export bash function inline

2

Eu tenho isso:

foo(){
   install_ores_gitflow;
   command foo "$@"
}

export -f foo;

Estou procurando algo assim:

export foo(){
   install_ores_gitflow;
   command foo "$@"
}

mas essa sintaxe não está correta.

Uma técnica que encontrei é esta: Como exportar todas as funções do Bash em um arquivo em uma linha?

então isso significa que eu poderia fazer isso:

set -a;

foo(){
  install_ores_gitflow;
  command foo "$@"
}

set +a;

mas eu não gosto dessa solução porque o script de sourcing poderia ter set -a , o que significa que meu script substituiria o que é muito ruim.

    
por Alexander Mills 31.08.2018 / 22:57

3 respostas

3

Este é um hack desagradável, mas pelo menos permite colocar o comando export acima da definição da função onde é mais fácil vê-lo.

# a function to create a dummy function and export it
export_function() { eval "function $1 { :; }; export -f $1"; }

# then

export_function foo
foo() { echo "here is the *real* function"; }
    
por 31.08.2018 / 23:46
2

Por que você não verifica o status da opção -a com, por exemplo, echo $- , então nenhuma ação é necessária se estiver definida?

    
por 31.08.2018 / 23:06
1

Tudo bem, então acho que essa é uma maneira sã e confiável de fazer isso:

#!/usr/bin/env bash

if [[ ! "$SHELLOPTS" =~ "allexport" ]]; then
    set -a;
    all_export=nope;
fi


ores_git_merge_with_integration(){
   install_ores_gitflow;
   command "$FUNCNAME" "$@"
}

ores_git_tools(){
   install_ores_gitflow;
   command "$FUNCNAME" "$@"
}


if [ "$all_export" == "nope" ]; then
  set +a;
fi

no seu script bash, potencialmente poderia agrupar todas as suas funções para serem exportadas e envolvê-las com os comandos set -a / set +.

A finalidade de verificar o $SHELLOPTS env var é ver se o conjunto -a não estava ativado e, se não foi, precisamos desativá-lo quando terminarmos.

    
por 01.09.2018 / 06:45