Jak dodać funkcję do .bash_profile / .profile / bashrc w powłoce?


24

Mam funkcję, która konwertuje czas epoki do tej pory. Oto definicja

date1(){
  date -d @$1
}

Chciałbym móc pisać:

$ date1 xxxyyy

Gdzie xxxyyy to parametr, który przekazuję do mojej funkcji, aby uzyskać odpowiednią datę. Rozumiem, że trzeba dodać go albo .bash_profile, .profilelub .bashrc, a następnie pozyskać go:

$ source file

Ale nie jestem pewien, w którym pliku go umieścić. Obecnie go mam .profile. Ale żeby go uruchomić, muszę to robić za source .profilekażdym razem.

Najlepiej byłoby, gdyby był dostępny, gdy komputer uruchamia się jak zmienna środowiskowa.


dla próbki wejściowej; 1. wyjście tekstowe epochconverter.com ma teraz 1514917788; 2. od samego bash $ date +% s na stackoverflow.com/questions/1092631
AnneTheAgile

Odpowiedzi:


25

Od man bash:

Kiedy bash jest wywoływany jako interaktywna powłoka logowania lub jako nieinteraktywna powłoka z opcją --login, najpierw czyta i wykonuje polecenia z pliku / etc / profile, jeśli plik ten istnieje. Po odczytaniu tego pliku szuka ~ / .bash_profile, ~ / .bash_login i ~ / .profile, w tej kolejności, i odczytuje i wykonuje polecenia z pierwszego, który istnieje i jest możliwy do odczytu.

Innymi słowy, można umieścić go w dowolnym ~/.bash_profile, ~/.bash_loginlub ~/.profile, czy wszystkie pliki sourcebyłyby przez jedną z tych . Zazwyczaj ~/.profileźródło ~/.bashrc, które jest „osobistym plikiem inicjującym, wykonywanym dla powłok logowania”.

Aby ją włączyć, uruchom nową powłokę, uruchom exec $SHELLlub uruchom source ~/.bashrc.


1
Cóż, wypróbowałem swój sposób na utworzenie niestandardowej funkcji wypisywania jej argumentu, ale nawet jeśli dodam tę funkcję, .bash_profileto również muszę to robić source ~/.bash_profileza każdym razem, gdy otwieram terminal skrótem Ctrl+Alt+T.
Vicky Dev,

@VickyDev Jeśli musisz za source ~/.bash_profilekażdym razem, oznacza to, że twoja konfiguracja Bash jest w jakiś sposób niestandardowa lub zepsuta (jak man bashwspomniano na wyjściu). Czy na pewno używasz Bash? Na przykład, czy echo $BASHPIDcoś drukuje?
l0b0

Czy musisz dodać #!/bin/shna górze, .profileaby zdefiniować funkcję?
Kolob Canyon

13

Po zdefiniowaniu funkcji w swoim .profiledodaj export -f date1. Spowoduje to wyeksportowanie funkcji do użycia przez powłokę logowania.


+1 do eksportu, musiałem wywoływać i alias w ssh ProxyCommand, i ciągle szeptał o aliasie nie znalezionym nawet po źródłowym pliku .profile. Po eksporcie działa jak urok.
Abhishek Anand,

7

Wprowadzane są dostosowania interaktywnych powłok ~/.bashrc. Do rzeczy, które chcesz uruchomić po zalogowaniu, przechodzą ~/.profile(lub ~/.bash_profile, ale często nie są ładowane przy logowaniu).

Umieść tę definicję funkcji w ~/.bashrc.

Ponieważ bash nie ładuje się, .bashrcgdy jest powłoką logowania, zmuś go do tego: napisz ~/.bash_profilezawierający

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

tzn. ładuj ~/.profile, a także ładuj, ~/.bashrcjeśli powłoka jest interaktywna.

Zobacz Alternatywa dla .bashrc i posty tam połączone.


1

csh i tcsh nie obsługują funkcji takich jak bash, ale możesz to zrobić.

Na przykład tutaj jest prosta funkcja do drukowania tekstu

alias print_hello_world 'eval echo "hello world"'

przekazywanie argumentów do skryptu

repeate_after_me 'eval echo "$1"'

robienie kodu wieloliniowego jak instrukcja if jest dość skomplikowane, ale proszę bardzo.

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

nadal będziesz musiał ewaluować, ale najbardziej złożoną częścią jest wykonywanie \!:[x]składni w celu uzyskania danych wejściowych z wiersza poleceń.

To powinno wystarczyć, żebyś się załatwił.


0

Możesz przekierować wszystkie bieżące funkcje do bashrc za pomocą składu .

Na przykład oto, jak dodam funkcję polecenia openstack z opcjonalnym parametrem do bashrc:

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

Teraz jest zapisywany na przyszłe sesje i może być używany w następujący sposób:

$ urc 

lub

$ urc --debug

-1

punkt 18: W mojej starszej pamięci, kiedy administrator, nauka ksh i bash była kinem na odwrót. 1: - / etc / zawartość profilu są sysWide. / etc / skel zawierał plik przekazany nowym kontom. Ponieważ Bash jest teraz wspólny dla wszystkich dystrybucji. następny będzie 2: - ~ / .profile jako standard systemowy, a następnie w ramach .profile „jeśli istnieje” .bash_profile umieści -> 3: - .bash_profile 4: - .bash_login 5: -. bashrc .bash_aliases będzie w Moim zdaniem, bardziej poprawna kolejność, konfiguracja standardowego środowiska Terminal i Shell oraz zwykłe .bash_login nigdy nie znaleziono lub nie istnieje (jest to niestandardowe dla użytkownika). Z .profile $ PATH jest głównym jeśli.
Zauważyłem, że dodałem też .bash_profile .profile wciąż dominuje i nie szanuje obecności .bash_profile. Oprócz informacji w nagłówku nikt się nie aktualizuje, np .: uruchomienie bash Próbki - ta struktura katalogów już nie istnieje - wraz z przykładami i / lub plikami są gzip. Więc aktualizacja Gnu-Bash jest w porządku


1
O czym ty mówisz?
Jesse_b
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.