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

24

Eu tenho uma função que converte época até a data. Aqui está a definição

date1(){
  date -d @$1
}

Eu gostaria de poder escrever:

$ date1 xxxyyy

Onde xxxyyy é o parâmetro que passo na minha função para que eu possa obter a data correspondente. Eu entendo que eu tenho que adicioná-lo em qualquer .bash_profile, .profileou .bashrce, em seguida, fonte ele:

$ source file

Mas não tenho certeza de qual arquivo colocá-lo. Atualmente, tenho o arquivo .profile. Mas para executá-lo, eu tenho que fazer o source .profiletempo todo.

Idealmente, deve disponibilizá-lo quando o computador iniciar como a variável de ambiente.

Cara
fonte
para uma amostra de entrada; 1. saída de texto epochconverter.com agora é 1514917788; 2. do bash propriamente $ date +% s por stackoverflow.com/questions/1092631/…
AnneTheAgile

Respostas:

25

De man bash:

Quando o bash é chamado como um shell de login interativo ou como um shell não interativo com a opção --login, ele primeiro lê e executa comandos do arquivo / etc / profile, se esse arquivo existir. Depois de ler esse arquivo, ele procura ~ / .bash_profile, ~ / .bash_login e ~ / .profile, nessa ordem, e lê e executa comandos do primeiro que existe e é legível.

Em outras palavras, você pode colocá-lo em qualquer uma das ~/.bash_profile, ~/.bash_loginou ~/.profile, ou quaisquer arquivos sourcede d, por um desses . Normalmente ~/.profile, o código-fonte ~/.bashrcé o "arquivo de inicialização pessoal, executado para shells de login".

Para habilitá-lo, inicie um novo shell, execute exec $SHELLou execute source ~/.bashrc.

l0b0
fonte
1
Bem, eu tentei o seu caminho para criar uma função personalizada de impressão do argumento, mas mesmo se eu adicionar essa função .bash_profile, também tenho que fazer source ~/.bash_profiletoda vez que abro o terminal por atalho Ctrl+Alt+T.
Vicky Dev
@VickyDev Se você precisar source ~/.bash_profile, isso é uma indicação de que sua configuração do Bash é de alguma forma fora do padrão ou está quebrada (conforme a man bashsaída mencionada). Tem certeza de que está realmente executando o Bash? Por exemplo, echo $BASHPIDimprime alguma coisa?
L0b0
Você precisa adicionar #!/bin/shao topo da página .profilepara definir uma função?
Kolob Canyon
13

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

DopeGhoti
fonte
+1 para exportação, tive que chamar e alias no ssh ProxyCommand, e ele continuou falando sobre alias não encontrado mesmo após o arquivo .profile de origem. Funciona como um encanto após a exportação.
Abhishek Anand
7

Personalizações para shells interativos entram em cena ~/.bashrc. As coisas que você deseja executar ao fazer login são acessadas ~/.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 .bashrcquando é um shell de login, force-o a fazer isso: escreva um ~/.bash_profilecontendo

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

ou seja ~/.profile, carregar e também carregar ~/.bashrcse o shell for interativo.

Veja Alternativa para .bashrc e as postagens linkadas lá.

Gilles 'SO- parar de ser mau'
fonte
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 várias linhas como uma instrução if é meio complicado, mas aqui está.

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

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

Isso deve ser o suficiente para resolver o problema.

user1610950
fonte
0

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

Por exemplo, veja como estou adicionando uma função de um comando openstack com parâmetro opcional no 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
Noam Manos
fonte
-1

ponto 18: Na minha memória antiga, quando um administrador, aprender ksh e bash era muito diferente. 1: - O conteúdo do / etc / profile é sysWide. / etc / skel continha o arquivo fornecido para novas contas. Desde Bash agora é comum em todas as distros. o próximo seria 2: - ~ / .profile como padrão do sistema e dentro do conteúdo de .profile "se existir" .bash_profile colocaria -> 3: - .bash_profile 4: - .bash_login 5: -. bashrc .bash_aliases estaria em na minha opinião, a ordem mais correta é a configuração do ambiente Terminal e Shell padrão e o .bash_login usual nunca encontrado ou existente (é personalizado por usuário). Com .profile $ PATH sendo principal se o.
Estou descobrindo agora adicionando também .bash_profile .profile ainda está dominando e não respeitando a presença de .bash_profile. Junto com as informações do cabeçalho, ninguém está atualizando, por exemplo: amostras de inicialização do bash - essa estrutura de diretórios não existe mais - junto com exemplos e / ou arquivos são compactados em gzip. Portanto, a atualização para o Gnu-Bash está em ordem

AtomicK
fonte
1
O quê você está querendo?
21418 Jesse_b