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?

Abel Melquiades Callejo
źródło

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).
Oli
źródło
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.

Radu Rădeanu
źródło
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.

Sergiy Kolodyazhnyy
źródło