Como trabalhar com funções em bash

Pretendo deixar mais claro como utilizar funções em shell, também pretendo abordar temas como retorno da função, declaração de constantes, variáveis locais, variáveis globais, argumentos para as funções etc. Espero que essa contribuição possa ajudar algumas pessoas no futuro.

[ Hits: 91.064 ]

Por: Denis Doria em 03/07/2008


WORKAROUNDs



Um dos problemas que tive que vale a pena ser documentado aqui foi quando uma das minhas funções tinha o mesmo nome que um comando, o bash sempre dá preferência a função e nunca ao comando, você têm algumas opções, a primeira e a mais simples é mudar o nome da função, porém digamos que na verdade essa função está em uma biblioteca que você fez, e que diversas pessoas já estão utilizando, mudar o nome quebraria diversos programas que estão funcionando corretamente, infelizmente você foi bem infeliz e deu o nome de 'sort' para a sua função.

Bem, alguém precisa usar o comando sort, e sua biblioteca juntos, o que fazer se não pudermos mudar o nome?

A primeira coisa que pensei foi em fazer um SORT=$(which sort), essa é a melhor solução que encontrei para esse problema.

Outra situação que me deparei foi bem parecida com essa, o grande problema é que alguém teve a infeliz idéia de chamar a função de 'cd'; como o comando cd é do próprio bash, ele não retorna nada quando fazemos 'which cd'; sendo assim a solução acima não funcionaria, o que fiz foi utilizar outro comando do shell o 'builtin', esse comando chama qualquer builtin do bash ignorando a função do mesmo nome.

Página anterior    

Páginas do artigo
   1. Introdução
   2. Como passar argumentos para a função? E o retorno da função?
   3. Variáveis globais X variáveis locais X constantes
   4. WORKAROUNDs
Outros artigos deste autor

Trabalhar com array no Bash

Leitura recomendada

Simples e rápido: matando todos os processos de um usuário

Algoritmos em Shell Script

Variáveis, if, else e unless em Ruby

Shell Script: Primeiros conceitos

Debugando shell scripts

  
Comentários
[1] Comentário enviado por ux386 em 03/07/2008 - 22:50h

>A primeira coisa que pensei foi em fazer um SORT=$(which sort), essa é a melhor
> solução que encontrei para esse problema.

Assim como existe o "builtin" que podemos usar quando uma função sobrescreve um builtin,
existe também o "command", que sempre chama um comando externo, mesmo que haja uma
função com o mesmo nome.

# uname() { echo "Função."; }
# uname -r
Função.
# command uname -r
2.6.18-4-686

[2] Comentário enviado por arauto em 03/07/2008 - 22:56h

Legal, o artigo, são dicas que valem a pena saber e recordar.

[3] Comentário enviado por roberva em 04/07/2008 - 15:02h

Como o outro, muito bom.
Parabéns amigo pelo conteúdo do ótimo artigo!

[4] Comentário enviado por thuck em 04/07/2008 - 15:18h

Obrigado ux386 pelo comentário, realmente o que vc mostrou funciona muito bem.

Obrigado pelos comentários até agora.

[5] Comentário enviado por albathross em 17/05/2011 - 11:37h

Denis, excelente artigo.

Durante a leitura, surgiu a dúvida neste trecho do artigo:

...

Tudo funcionou como imaginávamos, agora vamos ver como o bash armazenou a função:

minha_funcao ()
{
echo 'minha funcao'
}

...


Saí em busca para sanar a dúvida e encontrei a opção -f do comando declare.
declare. -f "nome da função".

Veja na sequência de comandos:

user@debianMachine:~/shell/funções$ function minha_funcao(){ echo 'minha funcao'; }
user@debianMachine:~/shell/funções$ minha_funcao
minha funcao
user@debianMachine:~/shell/funções$ declare -f minha_funcao
minha_funcao ()
{
echo 'minha funcao'
}


Fonte:
http://unix.derkeiler.com/Newsgroups/comp.unix.solaris/2007-04/msg00957.html
http://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/declareref.html


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts