Como posso criar uma função local no meu bashrc?

33

Meu .bashrc tinha algum código que era repetitivo, então usei uma função para simplificá-lo

do_stuff() {
  local version=$1
  export FOO_${version}_X="17"
  export FOO_${version}_Y="42"
}

do_stuff '5.1'
do_stuff '5.2'

No entanto, agora, quando uso meu shell, o nome "do_stuff" está no escopo para que eu possa concluir a tabulação e executar essa função (possivelmente bagunçando minhas variáveis de ambiente). Existe uma maneira de tornar o "do_stuff" visível apenas dentro do .bashrc?

    
por hugomg 11.12.2013 / 21:36

4 respostas

36

Use unset como última linha no seu .bashrc :

unset -f do_stuff

irá apagar / desmarcar a função do_stuff .

Para excluir / desmarcar as variáveis, chame-o da seguinte forma:

unset variablename
    
por 11.12.2013 / 21:47
13

A outra opção é usar sublinhados como em outras linguagens com script para indicar que você não pretende que essa função seja pública. A probabilidade de você digitar _do_foo é muito pequena e também é improvável que entre em conflito com mais ninguém.

    
por 12.12.2013 / 01:00
2

A única solução em que consigo pensar é enfatizá-lo e dar-lhe um nome bem único, talvez até mesmo um namespace com pontos como uma linguagem de fantasia ( mas isso não funcionará em ye olde sh ).

Heck, isso não terá conflitos:

_my_foobar_method_91a3b52d990f4a9f9d5d9423ec37b64c () {
    # Custom proprietary logic protected ID 10 T intellectual property copyright clauses.
    cat <<< 'echo $(xargs printf <<< "$1")'; }
}
    
por 08.01.2016 / 14:56
1

Como sugerido em um comentário, você pode usar um subshell:

#!/bin/bash

. <(
  do_stuff() {
    local version="$1" valid='^\w+$'

    [[ "$version" =~ $valid ]] &&
      cat <<SIDE               || echo "$FUNCNAME: invalid '$version'" >&2
export FOO_${version}_X=17
export FOO_${version}_Y=42
SIDE
  }

  do_stuff 5.0 # FOO_5.0_X is "not a valid identifier"
  do_stuff 5_1
  do_stuff 5_2
)

do_keep() { :; } # just get sure the report below actually works

set | egrep '(do_|FOO_)' |  sed -e 's,^,set:\x09,'

Criamos outro script na saída padrão subshell para o único efeito colateral que desejamos (usando here document <<SIDE ). Então nós procuramos com . .

O poder de 'mise en abime' em sh é uma fonte assustadora de admiração.

    
por 18.12.2017 / 12:02

Tags