Come aggiungere una funzione a .bash_profile / .profile / bashrc nella shell?


24

Ho una funzione che converte il tempo fino ad oggi. Ecco la definizione

date1(){
  date -d @$1
}

Mi piacerebbe poter scrivere:

$ date1 xxxyyy

Dove xxxyyy è il parametro che passo nella mia funzione in modo da poter ottenere la data corrispondente. Capisco devo aggiungere che in entrambi .bash_profile, .profileo .bashrce quindi fonte esso:

$ source file

Ma non sono sicuro in quale file inserirlo. Attualmente, ce l'ho .profile. Ma per eseguirlo, devo farlo source .profileogni volta.

Idealmente, dovrebbe renderlo disponibile quando il computer si avvia come la variabile di ambiente.


per un campione di input; L'output 1.text epochconverter.com ora è 1514917788; 2.From bash stessa $ date +% s per stackoverflow.com/questions/1092631/...
AnneTheAgile

Risposte:


25

Da man bash:

Quando bash viene invocato come shell di login interattiva o come shell non interattiva con l'opzione --login, legge prima ed esegue i comandi dal file / etc / profile, se quel file esiste. Dopo aver letto quel file, cerca ~ / .bash_profile, ~ / .bash_login e ~ / .profile, in quell'ordine, e legge ed esegue i comandi dal primo che esiste ed è leggibile.

In altre parole, si può mettere in uno qualsiasi dei ~/.bash_profile, ~/.bash_logino di ~/.profile, o di qualsiasi file sourced da uno di questi . Generalmente ~/.profileeseguirà il sorgente ~/.bashrc, che è il "file di inizializzazione personale, eseguito per le shell di accesso".

Per abilitarlo, avvia una nuova shell, esegui exec $SHELLo esegui source ~/.bashrc.


1
Bene, ho provato a creare una funzione personalizzata per stampare l'argomento, ma anche se aggiungo quella funzione, .bash_profiledevo farlo anche source ~/.bash_profileogni volta che apro il terminale tramite collegamento Ctrl+Alt+T.
Vicky Dev,

@VickyDev Se devi farlo source ~/.bash_profileogni volta, ciò indica che la tua configurazione di Bash è in qualche modo non standard o rotta (come per l' man bashoutput menzionato). Sei sicuro di usare Bash? Ad esempio, echo $BASHPIDstampa qualcosa?
l0b0

Devi aggiungere #!/bin/shall'inizio di .profiledefinire una funzione?
Kolob Canyon,

13

Dopo aver definito la funzione nel tuo .profile, aggiungi export -f date1. In questo modo la funzione verrà esportata per essere utilizzata dalla shell di accesso.


+1 per l'esportazione, ho dovuto invocare e alias in ProxyCommand ssh, e continuava a paralizzare su alias non trovato nemmeno dopo il .profile di origine. Funziona come un incanto dopo l'esportazione.
Abhishek Anand,

7

Entrano le personalizzazioni per le shell interattive ~/.bashrc. Le cose che si desidera eseguire quando si accede vanno ~/.profile(o ~/.bash_profile, ma spesso non vengono caricate quando si accede graficamente).

Inserisci questa definizione di funzione in ~/.bashrc.

Poiché bash non viene caricato .bashrcquando si tratta di una shell di accesso, forzarlo a farlo: scrivere un ~/.bash_profilecontenitore

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

vale a dire caricare ~/.profilee caricare anche ~/.bashrcse la shell è interattiva.

Vedi Alternativa a .bashrc e ai post collegati lì.


1

csh e tcsh non supportano funzioni come bash ma puoi farlo.

Ad esempio, ecco una semplice funzione per stampare del testo

alias print_hello_world 'eval echo "hello world"'

passare argomenti alla sceneggiatura

repeate_after_me 'eval echo "$1"'

fare un codice a più righe come un'istruzione if è un po 'complicato, ma ecco qui.

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

dovrai comunque valutare ma la parte più complessa sta facendo la \!:[x]sintassi per ottenere l'input dalla riga di comando.

Dovrebbe essere abbastanza per farti risolvere.


0

È possibile reindirizzare tutte le funzioni correnti a bashrc con la composizione .

Ad esempio, ecco come sto aggiungendo una funzione di un comando openstack con parametro opzionale, in bashrc:

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

Ora viene salvato per sessioni future e può essere utilizzato come:

$ urc 

o

$ urc --debug

-1

punto 18: Nella mia memoria più vecchia, quando un amministratore, imparare ksh e bash era kina al contrario. 1: - / etc / i contenuti del profilo sono sysWide. / etc / skel conteneva il file dato ai nuovi account. Dal momento che Bash ora primo comune di tutta la distribuzione. il prossimo sarebbe 2: - ~ / .profile come standard di sistema, quindi nei contenuti di .profile "se esiste" .bash_profile metterebbe -> 3: - .bash_profile 4: - .bash_login 5: -. bashrc .bash_aliases sarebbe in penso all'ordine più corretto, alla configurazione dell'ambiente Terminal e Shell standard e al solito .bash_login mai trovato o esistente (personalizzato per utente). Con .profile $ PATH essendo principale se il.
Sto scoprendo ora di aggiungere anche .bash_profile .profile è ancora dominante e non rispetta la presenza di .bash_profile. Insieme alle informazioni di intestazione nessuno sta aggiornando, ad esempio: bash startup Esempi - quella struttura di directory non è più - insieme ad esempi e / o file sono compressi con gzip. Quindi l'aggiornamento a Gnu-Bash è in ordine


1
Cosa stai succedendo?
Jesse_b,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.