Onde posso colocar uma função de shell definida pelo usuário?

14

Estou planejando criar uma função que simplifique as coisas para mim. A função seria algo como

function lazymode()
{
echo "Hello World!";
}

para que quando eu uso o comando lazymodeno shell , ele produza o Hello World!.

Que arquivo devo colocar na função definida pelo usuário?

Abel Melquiades Callejo
fonte

Respostas:

13

Depende da função. Se for apenas uma linha única super simples como essa, você poderá criar um alias ou colar a função ~/.bashrc(um arquivo que o bash carrega quando é iniciado).

Se você estiver criando algo um pouco mais complexo, pode fazer mais sentido criar seu próprio script executável no ~/bin/qual não existirá por padrão (é apenas um diretório), mas deve estar no seu caminho. Lembre-se disso, o arquivo precisará ser executável ( chmod +x filename) e começar com uma #!/bin/bashestrofe adequada .

A segunda rota tem alguns benefícios claros:

  • É mais fácil ver o que está disponível
  • Um erro de sintaxe não irá afetar seu perfil
  • Você não precisa continuar pesquisando novamente sua configuração do bash se alterar o script
  • Está disponível para qualquer shell, desde que o caminho completo seja usado ou também ~/bin/esteja no caminho para esse shell (que deve ser, na maioria dos casos, AFAIK).
Oli
fonte
Eu usei a opção posterior. Minha função contém comandos que excluem arquivos, algo do wget, executa os comandos javac e java. e quando eu tentei no terminal gnome, não está funcionando bem. Você acha que há um problema?
Abel Melquiades Callejo
O que ele faz em vez disso?
Oli
Já está consertado. Corrigido através desta resposta
Abel Melquiades Callejo 13/09
umm ... os scripts do usuário não deveriam estar /usr/local/binmexendo com o $PATH?
Braiam 15/09/13
Parece-me que uma vantagem pequena, mas que vale a pena mencionar, de colocar funções ~/.bashrc(como é sourced) é que o Bash procura funções antes de fazer a pesquisa PATH.
Zanna
4

A melhor opção seria ~/.bashrcarquivar.

Você pode escrever suas definições de função de shell diretamente em seu ~/.bashrcarquivo ou, se você tiver muitas delas e não quiser desorganizar seu ~/.bashrcarquivo, poderá colocá-las em outro arquivo de sua escolha - apenas certifique-se de que arquivo no seu ~/.bashrcarquivo. Por exemplo, se o arquivo com suas funções for nomeado bash_functions, basta adicionar no seu ~/.bashrcarquivo as linhas:

if [[ -f /path/to/bash_functions ]]; then
    source /path/to/bash_functions
fi

ou equivalente:

if [[ -f /path/to/bash_functions ]]; then
    . /path/to/bash_functions
fi

onde o .é apenas uma representação simbólica de source. O ifteste garante que o arquivo /path/to/bash_functionsexista antes de tentar a origem.

Essa técnica é muito semelhante ao estabelecimento de aliases ~/.bashrc, criando um arquivo chamado ~/.bash_aliasese usando uma sintaxe semelhante à descrita acima ~/.bashrcpara testar sua existência e, em seguida, fonte-lo.

Radu Rădeanu
fonte
obrigado, funcionou. a propósito, qual é a sua diferença com .profile? em alguns linux, eu não posso colocar funções em bashrc
Abel Melquiades Callejo
2
~/.profileO arquivo é executado pelo interpretador de comandos para shells de login. Quando você usa a GUI e abre o terminal, esse arquivo não é executado porque você estará em um shell que não é de login.
Radu Rădeanu
1

Aqui está um procedimento essencial para declarar uma função permanente:

  1. Abra o ~/.bashrcarquivo em um editor de texto. Não importa qual editor de texto, desde que você saiba como usá-lo e desde que você abra o/home/<username>/.bashrc

  2. No final do ~/.bashrcdeclarar sua própria função, por exemplo:

    find_dirs(){
        find "$1" -type d
    }
  3. Salve e feche o arquivo.

O ~/.bashrcarquivo é lido toda vez que você abre o shell interativo (que é a nova guia do terminal, sshefetua login ou abre o TTY1 ou outro console virtual). Isso não estará disponível nos arquivos de script, porque ~/.bashrcnão é lido para shells não interativos. Também não está disponível se você executar bashcom a --norcopção

Se você deseja que a função esteja disponível imediatamente na guia atualmente aberta, use o source ~/.bashrccomando


Funções recebem argumentos como comandos regulares. Por exemplo, $1através de $9indica os parâmetros posicionais quando você chama uma função. No exemplo acima, find_dirspega apenas um parâmetro posicional e seria chamado como find_dirs /etc. Você também pode usar $@para se referir a todos os parâmetros posicionais. As funções também aceitam o redirecionamento. Você pode chamar uma função com find_dirs $1 > /dev/null; também podemos declarar da seguinte forma:

find_dirs(){
    find "$1" -type d
}

Nota de man bash: "As funções são executadas no contexto do shell atual; nenhum novo processo é criado para interpretá-las". Isso significa que você também deve estar ciente das funções com capacidade de alterar o ambiente de execução do shell - alterar variáveis ​​e configurações do terminal.

Sergiy Kolodyazhnyy
fonte