Gdzie mogę umieścić funkcję powłoki zdefiniowaną przez użytkownika?


14

Planuję stworzyć funkcję, która uprościłaby mi sprawy. Ta funkcja byłaby podobna

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

więc gdy użyję polecenia lazymodew powłoce , wyświetli on Hello World!.

Jaki plik powinienem umieścić w funkcji zdefiniowanej przez użytkownika?

Odpowiedzi:


14

Zależy od funkcji. Jeśli jest to po prostu taki super-prosty linijka, możesz utworzyć alias lub włożyć funkcję ~/.bashrc(plik, który bash ładuje się podczas uruchamiania).

Jeśli tworzysz coś bardziej mięsistego, sensowniej byłoby stworzyć własny skrypt wykonywalny, w ~/bin/którym domyślnie nie istniałby (to tylko katalog), ale powinien znajdować się na twojej ścieżce. Pamiętaj, że w tym celu plik będzie musiał być wykonywalny ( chmod +x filename) i zacząć od odpowiedniej #!/bin/bashsekcji.

Druga trasa ma pewne wyraźne zalety:

  • Łatwiej jest zobaczyć, co jest dostępne
  • Błąd składni nie spowoduje tankowania Twojego profilu
  • W przypadku zmiany skryptu nie trzeba ponownie pozyskiwać konfiguracji bash
  • Jest dostępny dla każdej powłoki, o ile używana jest pełna ścieżka, lub też ~/bin/znajduje się na ścieżce dla tej powłoki (która powinna być w większości przypadków AFAIK).

Użyłem późniejszej opcji. Moja funkcja zawiera polecenia, które usuwają pliki, coś wget, wykonuje polecenia javac i java. a kiedy wypróbowałem to na gnomie, nie działa dobrze. Czy uważasz, że jest jakiś problem?
— Abel Melquiades Callejo

Co robi zamiast tego?
— Oli

Jest już naprawione. Naprawiono dzięki tej odpowiedzi
— Abel Melquiades Callejo,

umm ... czy skrypty użytkownika nie powinny być w tym /usr/local/binzamieszane $PATH?
— Braiam

Wydaje mi się, że niewielką, ale wartą wspomnienia zaletą wprowadzania funkcji ~/.bashrc(ponieważ jest to sourced), jest to, że Bash szuka funkcji przed rozpoczęciem wyszukiwania PATH.
— Zanna

4

Najlepszym wyborem będzie ~/.bashrcplik.

Możesz zapisać definicje funkcji powłoki bezpośrednio w ~/.bashrcpliku lub, jeśli masz ich wiele i nie chcesz zaśmiecać swojego ~/.bashrcpliku, możesz umieścić je wszystkie w innym wybranym pliku - po prostu upewnij się, że źródło plik w twoim ~/.bashrcpliku. Na przykład, jeśli plik z twoimi funkcjami ma nazwę bash_functions, po prostu dodaj do ~/.bashrcpliku linie:

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

lub równoważnie:

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

gdzie .jest tylko symboliczną reprezentacją source. Te ifmarki testowe czy plik /path/to/bash_functionsistnieje przed próbą jej źródła.

Ta technika jest bardzo podobna do ustanawiania aliasów ~/.bashrcpoprzez utworzenie pliku o nazwie ~/.bash_aliasesi użycie podobnej składni do powyższej w ~/.bashrccelu przetestowania jego istnienia, a następnie źródła.


dzięki, zadziałało. nawiasem mówiąc, jaka jest różnica z .profile? w niektórych systemach Linux nie mogę umieścić funkcji w bashrc
— Abel Melquiades Callejo

2
~/.profileplik jest wykonywany przez interpreter poleceń dla powłok logowania. Gdy korzystasz z GUI i otwierasz terminal, plik ten nie jest wykonywany, ponieważ będziesz w powłoce bez logowania.
— Radu Rădeanu,

1

Oto niezbędna procedura deklarowania stałej funkcji:

  1. Otwórz ~/.bashrcplik w edytorze tekstu. Nie ma znaczenia, który edytor tekstu, o ile wiesz, jak go używać i dopóki go otwierasz/home/<username>/.bashrc

  2. Na końcu ~/.bashrcdeklaruj własną funkcję, na przykład:

    find_dirs(){
        find "$1" -type d
    }
  3. Zapisz i zamknij plik.

~/.bashrcPlik jest czytać przy każdym otwarciu interaktywną powłokę (która jest nowa karta terminalu, poprzez logowanie sshlub otwarte tty1 lub inna wirtualna konsola). Nie będzie to dostępne w plikach skryptów, ponieważ ~/.bashrcnie jest odczytywane dla nieinteraktywnych powłok. Nie jest również dostępny, jeśli uruchamiasz bashz --norcopcją.

Jeśli chcesz, aby funkcja była natychmiast dostępna na aktualnie otwartej karcie, użyj source ~/.bashrcpolecenia.


Funkcje przyjmują argumenty tak jak zwykłe polecenia. Na przykład, $1poprzez $9wskazuje parametry pozycyjne podczas wywoływania funkcji. W powyższym przykładzie find_dirsbierze tylko jeden parametr pozycyjny i będzie wywoływany jako find_dirs /etc. Możesz także użyć, $@aby odwołać się do wszystkich parametrów pozycyjnych. Funkcje akceptują również przekierowanie. Możesz wywołać funkcję za pomocą find_dirs $1 > /dev/null; możemy również zadeklarować to w następujący sposób:

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

Uwaga od man bash: „Funkcje są wykonywane w kontekście bieżącej powłoki; nie jest tworzony nowy proces ich interpretacji”. Oznacza to, że powinieneś także pamiętać o funkcjach, które mogą zmieniać środowisko wykonywania powłoki - zmieniaj zmienne i ustawienia terminala.

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.