Como adicionar uma função ao .bash_profile / .profile / bashrc no shell?

21

Eu tenho uma função que converte o tempo de data em dia. Aqui está a definição

date1(){
  date -d @$1
}

Eu gostaria de poder escrever:

$ date1 xxxyyy

Onde xxxyyy é o parâmetro que eu passo para a minha função, então eu posso obter a data correspondente. Eu entendo que eu tenho que adicioná-lo em .bash_profile , .profile ou .bashrc e, em seguida, fonte:

$ source file

Mas, não sei ao certo qual arquivo colocá-lo. Atualmente, eu o tenho em .profile . Mas, para executá-lo, tenho que fazer source .profile todas as vezes.

O ideal é disponibilizá-lo quando o computador for iniciado como a variável de ambiente.

    
por Dude 25.12.2013 / 19:12

6 respostas

21

De man bash :

When bash is invoked as an interactive login shell, or as a non-interactive shell with the --login option, it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable.

Em outras palavras, você pode colocá-lo em qualquer um dos grupos ~/.bash_profile , ~/.bash_login ou ~/.profile , ou qualquer arquivo source d por qualquer um desses . Normalmente, ~/.profile fornecerá ~/.bashrc , que é o "arquivo de inicialização pessoal, executado para shells de login".

Para ativá-lo, inicie um novo shell, execute exec $SHELL ou execute source ~/.bashrc .

    
por 25.12.2013 / 19:48
12

Depois de definir a função em .profile , adicione export -f date1 . Isso exportará a função para uso pelo seu shell de login.

    
por 25.12.2013 / 19:20
6

Personalizações para shells interativos vão para ~/.bashrc . As coisas que você deseja executar ao efetuar login entram em ~/.profile (ou ~/.bash_profile , mas geralmente não são carregadas ao fazer login graficamente).

Coloque esta definição de função em ~/.bashrc .

Como o bash não carrega .bashrc quando é um shell de login, force-o a fazer isso: escreva um ~/.bash_profile contendo

. ~/.profile
case $- in *i*) . ~/.bashrc;; esac

i.e. carregue ~/.profile e também carregue ~/.bashrc se o shell for interativo.

Consulte Alternativa para .bashrc e as postagens vinculadas lá.

    
por 26.12.2013 / 00:14
1

O csh e o tcsh não suportam funções como o bash, mas você pode fazê-lo.

Por exemplo, aqui está uma função simples para imprimir algum texto

alias print_hello_world 'eval echo "hello world"'

passando argumentos para o script

repeate_after_me 'eval echo "$1"'

fazer código de múltiplas linhas como uma instrução if é meio complicado, mas aqui vai você.

alias X 'eval "if (\!:1 =~ 'yes') then \
          echo yes \
          else \
          echo no \
          endif"'

você ainda terá que avaliar, mas a parte mais complexa é fazer a sintaxe \!:[x] para obter a entrada da linha de comando.

Isso deve ser suficiente para você resolver.

    
por 11.09.2016 / 17:09
0

Você pode redirecionar todas as funções atuais para bashrc com typeset .

Por exemplo, aqui está como eu estou adicionando uma função de um comando openstack com parâmetro opcional, em bashrc:

urc() { . stackrc; set -x; openstack server list --all $1; set +x; }
typeset -f >> ~/.bashrc

Agora ele é salvo para sessões futuras e pode ser usado como:

$ urc 

ou

$ urc --debug
    
por 27.11.2018 / 14:20
-1

ponto 18: Na minha memória mais antiga, quando um administrador, aprendendo ksh e bash, era diferente do outro. 1: - / etc / profile contents são sysWide. / etc / skel continha o arquivo dado a novas contas. Desde Bash agora prime comum de toda distro. o próximo seria 2: - ~ / .profile como padrão do sistema, em seguida, dentro de conteúdos de .profile "se existe" .bash_profile colocaria - > 3: - .bash_profile 4: - .bash_login 5: -. Bashrc .bash_aliases seria em minha mente a ordem mais correta, configurando o ambiente padrão do Terminal e Shell e usual .bash_login nunca encontrado ou existente (seu personalizado por usuário). Com .profile $ PATH sendo principal se o .bash_profile seu conteúdo também conteria um determinado $ PATH e há seu acréscimo personalizado por necessidade pessoal de qual PATH adicional de pesquisa deve ser adicionado ao PATH do sistema se por acaso você precisar de um APP no seu caminho para acesso rápido.
Estou encontrando agora adicionando também .bash_profile .profile ainda está dominando e não respeita a presença de .bash_profile. Juntamente com informações de cabeçalho, ninguém está atualizando, por exemplo: bash startup Samples - essa estrutura de diretório não é mais - junto com exemplos e ou arquivos são gzip'd. Então, atualizar para o Gnu-Bash está em ordem

    
por 11.07.2018 / 21:18