É possível criar um arquivo no bash, mas pular funções específicas?

5

Suponha que eu tenha bash_functions.sh :

function test(){
}

function test2(){
}

E no meu ~/.bashrc eu faço:

source ~/bash_functions.sh

É possível, ao fazer o sourcing, evitar o fornecimento de uma função específica? Quero dizer, fonte tudo em bash_functions.sh , exceto por test ?

    
por Somebody still uses you MS-DOS 20.03.2011 / 06:47

4 respostas

3

Em uma definição de função foo () { … } , se foo for um alias, ele será expandido. Isso às vezes pode ser um problema, mas aqui ajuda. Alias foo para algum outro nome antes de fazer o sourcing do arquivo, e você estará definindo uma função diferente. No bash, a expansão de alias é desativada por padrão em shells não interativos, portanto, é necessário ativá-lo com shopt -s expand_aliases .

Se sourced.sh contiver

foo () {
  echo "foo from sourced.sh"
}

então você usa dessa maneira

foo () {
  echo "old foo"
}
shopt -s expand_aliases   # necessary in bash; just skip in ash/ksh/zsh
alias foo=do_not_define_foo
. sourced.sh
unalias foo; unset -f do_not_define_foo
foo

você recebe old foo . Observe que o arquivo originado deve usar a sintaxe da definição da função foo () { … } , não function foo { … } , porque a palavra-chave function bloquearia a expansão do alias.

    
por 20.03.2011 / 14:16
1

Não exatamente, no entanto, você pode substituir a função test (). A última definição de função sempre tem precedência. Portanto, se você originar um arquivo que tenha test() , defina uma função com o mesmo nome depois disso, a última função substituirá a que foi originada. Eu aproveito isso para fornecer alguma orientação a objetos em alguns dos meus scripts.

Exemplo:

bash_functions.sh:

test(){
    echo "This is the test function from bash_functions."
}
test2(){
    echo "This is the test2 function from bash_functions."
}

scripty_scripterson.sh

test2(){
    #this is thrown in just to show what happens in
    #the other direction
    echo "This is the test2 function from scripty."
}

source bash_functions.sh

test1(){
    echo "This is the test1 function from scripty."
}

test1
test2

Na linha de comando:

$ ./scripty_scripterson.sh 
This is the test1 function from scripty.
This is the test2 function from bash_functions.
    
por 20.03.2011 / 13:13
1

Você pode criar um arquivo temporário, lê-lo e excluí-lo depois. Para deletar a função 'teste', eu assumo aqui que não há '}' dentro da função.

sed '/test()/,/}/d' testrc > ./tmprc && source ./tmprc && rm tmprc
    
por 20.03.2011 / 14:20
0

Isso não é possível. Você pode dividir o bash_functions.sh em 2 arquivos, um incluir o que você quer originar, e outro incluir as funções que você não deseja obter. e use um terceiro arquivo de script para combiná-los para uso normal.

    
por 20.03.2011 / 07:57