W Bash, kiedy do aliasu, kiedy do skryptu i kiedy napisać funkcję?

360

Zadanie tego pytania zajęło mi prawie 10 lat użytkowania Linuksa. To wszystko było próbą i błędem oraz losowym surfowaniem po Internecie w późnych godzinach nocnych.

Ale ludzie nie powinni potrzebować na to 10 lat. Gdybym dopiero zaczynał od Linuksa, chciałbym wiedzieć: kiedy do aliasu, kiedy do skryptu, a kiedy do napisania funkcji?

Jeśli chodzi o aliasy, używam ich do bardzo prostych operacji, które nie wymagają argumentów.

alias houston='cd /home/username/.scripts/'

To wydaje się oczywiste. Ale niektórzy to robią:

alias command="bash bashscriptname"

(i dodaj go do .bashrcpliku)

Czy jest na to dobry powód? Bardzo się staram, ale naprawdę nie mogę wymyślić żadnych okoliczności, w których chciałbym to zrobić. Tak więc, jeśli istnieje przypadek skrajny, w którym miałoby to znaczenie, odpowiedz poniżej.

Ponieważ właśnie tam po prostu umieściłem coś w mojej ŚCIEŻCE i chmod +xto, co jest kolejną rzeczą, która pojawiła się po latach prób i błędów Linuksa.

Co prowadzi mnie do następnego tematu. Na przykład dodałem ukryty folder ( .scripts/) w katalogu domowym do mojej ŚCIEŻKI, po prostu dodając wiersz do mojego .bashrc( PATH=$PATH:/home/username/.scripts/), aby wszystko, co można tam wykonać, automatycznie się uzupełnia.

Gdybym musiał.

Tak naprawdę nie potrzebuję tego, prawda? Użyłbym tego tylko dla języków, które nie są powłoką, takich jak Python.

Jeśli jest to powłoka, mogę po prostu napisać funkcję wewnątrz tego samego .bashrc:

funcname () {
  somecommand -someARGS "$@"
}

Jak powiedziałem, wiele z tego znalazłem na zasadzie prób i błędów. I naprawdę naprawdę widziałem piękno funkcji, gdy zmarł mój komputer, i byłem zmuszony korzystać z komputerów ludzi wokół mnie, gdy z nich nie korzystali.

Zamiast przenosić cały katalog skryptów z komputera na komputer, w końcu po prostu zastąpiłem .bashrc innych użytkowników własnym, ponieważ nigdy nawet nie dokonali żadnej modyfikacji.

Ale czy coś mi umknęło?

Co byś powiedział początkującemu użytkownikowi systemu Linux o tym, kiedy należy alias, kiedy wykonać skrypt, a kiedy napisać funkcję?

Jeśli nie jest to oczywiste, zakładam, że osoby, które odpowiedzą na to pytanie, skorzystają ze wszystkich trzech opcji. Jeśli używasz tylko aliasów lub tylko skryptów lub tylko funkcji - lub jeśli używasz tylko aliasów i skryptów lub aliasów i funkcji lub skryptów i funkcji - to pytanie nie jest skierowane do Ciebie.

ixtmixilix
źródło
5
możliwy duplikat funkcji bash vs. skrypty
Gilles
10
+1 za wyraźne stwierdzenie wszystkich podzbiorów {alias, skrypt, funkcja}, na które to pytanie nie jest skierowane. +1 za dziecięcą wiarę, że można pominąć podzbiór zerowy.
Thomas L Holaday
1
Chociaż pytanie dotyczyło w szczególności bash, należy zauważyć, że starsze powłoki Bourne'a miały „alias”, ale nie działały. Może to mieć znaczenie, jeśli martwisz się kompatybilnością.
AndyB,
Jeśli .bashrc to naprawdę najlepsze miejsce, a przynajmniej solidne miejsce, do tego? Jest tak wiele sposobów na zrobienie tego samego w Linuksie, co doceniam, jednak wszystkie rzeczy są równe, wolę robić rzeczy najczęściej.
Kit10

Odpowiedzi:

242

Alias ​​nie powinien (ogólnie) robić więcej niż zmieniać domyślne opcje polecenia. To nic innego jak proste zastąpienie tekstu w nazwie polecenia. Nie może nic zrobić z argumentami, ale przekazuje je do polecenia, które faktycznie wykonuje. Jeśli więc po prostu potrzebujesz dodać argument z przodu jednego polecenia, alias zadziała. Typowe przykłady to

# Make ls output in color by default.
alias ls="ls --color=auto"
# make mv ask before overwriting a file by default
alias mv="mv -i"

Z funkcji należy korzystać, gdy trzeba zrobić coś bardziej złożonego niż alias, ale nie byłoby to przydatne samo w sobie. Weźmy na przykład odpowiedź na pytanie, które zadałem na temat zmiany grepdomyślnego zachowania w zależności od tego, czy jest ono w potoku:

grep() { 
    if [[ -t 1 ]]; then 
        command grep -n "$@"
    else 
        command grep "$@"
    fi
}

Jest to doskonały przykład funkcji, ponieważ jest zbyt skomplikowany dla aliasu (wymaga różnych ustawień domyślnych w zależności od warunku), ale nie jest to coś, czego potrzebujesz w nieinteraktywnym skrypcie.

Jeśli otrzymasz zbyt wiele funkcji lub funkcji za dużych, umieść je w osobnych plikach w ukrytym katalogu i umieść je w ~/.bashrc:

if [ -d ~/.bash_functions ]; then
    for file in ~/.bash_functions/*; do
        . "$file"
    done
fi

Skrypt powinien działać samodzielnie. Powinien mieć wartość jako coś, co można ponownie wykorzystać lub wykorzystać do więcej niż jednego celu.

Kevin
źródło
14
Ważne jest również, aby pamiętać, że - o ile nie pochodzi z .lub source- skrypt jest wykonywany przez osobny proces bash i ma własne środowisko. Z tego powodu wszystko, co modyfikuje środowisko powłoki (np. Funkcje, zmienne itp.), Nie przetrwa w środowisku powłoki, z którego uruchamiany jest skrypt.
Will Vousden,
260

Pozostałe odpowiedzi dostarczają miękkich ogólnych wskazówek opartych na osobistym guście, ale ignorują wiele istotnych faktów, które należy wziąć pod uwagę przy podejmowaniu decyzji między skryptami, funkcjami lub aliasami.

Aliasy i funkcje ¹

  • Cała zawartość aliasów i funkcji jest przechowywana w pamięci powłoki.
  • Naturalną konsekwencją tego jest to, że aliasy i funkcje mogą być używane tylko przez bieżącą powłokę, a nie przez inne programy, które można wywoływać z powłoki, takie jak edytory tekstu, skrypty, a nawet wystąpienia potomne tej samej powłoki.
  • Aliasy i funkcje są wykonywane przez bieżącą powłokę, tzn. Działają wewnątrz i wpływają na bieżące środowisko powłoki .² Nie jest wymagany osobny proces do uruchomienia aliasu lub funkcji.

Skrypty

  • Powłoki nie przechowują skryptów w pamięci. Zamiast tego skrypty są odczytywane z plików, w których są przechowywane, za każdym razem, gdy są potrzebne. Jeśli skrypt zostanie znaleziony podczas $PATHwyszukiwania, wiele powłok przechowuje w pamięci skrót nazwy ścieżki, aby zaoszczędzić czas na przyszłych $PATHprzeglądaniach, ale taki jest zasięg pamięci skryptu, gdy nie jest używany.
  • Skrypty można wywoływać na więcej sposobów niż funkcje i aliasy. Mogą być przekazywane jako argument do interpretera, podobnie jak sh scriptlub wywoływane bezpośrednio jako plik wykonywalny, w którym to przypadku interpreter w linii shebang (np. #!/bin/sh) Jest wywoływany, aby go uruchomić. W obu przypadkach skrypt jest uruchamiany przez osobny proces interpretera z własnym środowiskiem innym niż środowisko twojej powłoki, na którego środowisko skrypt nie ma żadnego wpływu. Rzeczywiście, powłoka interpretera nie musi nawet odpowiadać powłoce wywołującej. Ponieważ skrypty wywoływane w ten sposób wydają się zachowywać jak każdy zwykły plik wykonywalny, mogą być używane przez dowolny program.

    Wreszcie, skrypt można odczytać i prowadzony przez bieżącej powłoki z ., lub w niektórych muszli, source. W takim przypadku skrypt zachowuje się jak funkcja odczytywana na żądanie, a nie stale przechowywana w pamięci.

Podanie

Biorąc powyższe pod uwagę, możemy opracować ogólne wytyczne dotyczące tworzenia skryptów lub funkcji / aliasów.

  • Czy inne programy poza powłoką muszą być w stanie z niego korzystać? Jeśli tak, musi to być skrypt.

  • Czy chcesz, aby była ona dostępna tylko z interaktywnej powłoki? Często zachodzi potrzeba zmiany domyślnego zachowania wielu poleceń, gdy są uruchamiane interaktywnie, bez wpływu na zewnętrzne polecenia / skrypty. W tym przypadku użyj zestawu aliasów / funkcji w pliku rc powłoki „tylko w trybie interaktywnym” (w bashtym celu .bashrc).

  • Czy musi zmienić środowisko powłoki? Możliwe są zarówno funkcja / alias, jak i skrypt źródłowy.

  • Czy używasz tego często? Prawdopodobnie bardziej efektywne jest utrzymywanie go w pamięci, więc jeśli to możliwe, uczyń go funkcją / aliasem.

  • I odwrotnie, czy używasz go rzadko? W takim przypadku nie ma sensu mieć pamięci, gdy jej nie potrzebujesz, więc zrób z niej skrypt.


¹ Chociaż funkcje i aliasy mają kilka ważnych różnic, są one pogrupowane razem, ponieważ funkcje mogą robić wszystko, co mogą aliasy. Aliasy nie mogą mieć zmiennych lokalnych ani przetwarzać argumentów i są niewygodne w przypadku elementów dłuższych niż jedna linia.

² Każdy uruchomiony proces w systemie Unix ma środowisko składające się z variable=valuepary par, które często zawierają globalne ustawienia konfiguracji, takie jak LANGdomyślne ustawienia regionalne i PATHokreślające ścieżkę wyszukiwania wykonywalnego.

jw013
źródło
26
IMHO To najlepsza odpowiedź.
Luc M
4
Format pytania / odpowiedzi to świetny pomysł. Mógłbym to ukraść. ;-)
Mikel
4
Warto zauważyć: jeśli dwa (lub więcej) skryptów musi współdzielić jakiś kod, prawdopodobnie najlepiej jest umieścić ten kod w funkcji, która sama jest zlokalizowana w trzecim pliku, który oba te skrypty importują / źródło.
kbolino
3
Kolejny element do dodania do tej listy pytań: Czy kiedykolwiek trzeba zmieniać funkcjonalność polecenia w locie? zmiany w skrypcie zostaną odzwierciedlone we wszystkich sesjach, podczas gdy funkcje i aliasy muszą zostać ponownie załadowane lub ponownie zdefiniowane dla każdej sesji.
Stratus3D
3
Dobra odpowiedź. Jeszcze jedna ważna rzecz (dla mnie): podczas tworzenia „skrótu” do innych narzędzi lepiej jest użyć aliasu, ponieważ istniejące autouzupełnianie będzie działać tylko z aliasami, ale nie ze skryptami lub funkcjami (więc +1 dla aliasów). np. poprzez utworzenie alias g='gradle'autouzupełniania stopni podczas korzystania z mojego galiasu, ale nie wyskakuję z pudełka po użyciu skryptu gradle $*lub funkcji zgradle $@
Yoav Aharoni
37

Myślę, że to zależy od gustu każdej osoby. Dla mnie logika wygląda następująco:

  • Najpierw próbuję utworzyć alias, ponieważ jest najprostszy.
  • Jeśli rzecz jest zbyt skomplikowana, aby zmieścić się w jednej linii, staram się, aby była to funkcja.
  • Kiedy funkcja zaczyna rosnąć poza kilkanaście linii, umieszczam ją w skrypcie.

Naprawdę nic nie stoi na przeszkodzie, abyś zrobił coś, co działa .

phunehehe
źródło
6
Często pomijam opcję funkcji i od razu tworzę skrypt. Ale zgadzam się, że jest to częściowo kwestia gustu
Bernhard
2
Funkcja zaczyna mieć sens, jeśli jest potrzebna w kilku skryptach.
Nils,
7
... lub jeśli potrzebujesz efektów ubocznych, aby zmienić bieżącą powłokę.
glenn jackman
ma sens, stary!
odkrywca
15

Przynajmniej częściowo jest to kwestia osobistego gustu. Z drugiej strony istnieją pewne wyraźne rozróżnienia funkcjonalne:

  • aliasy: odpowiednie tylko dla prostych zamian tekstu, bez argumentów / parametrów
  • funkcje: łatwy do pisania / używania, pełna obsługa skryptów, dostępna tylko w bash
  • skrypty: mniej więcej podobne funkcje, ale dostępne (wywoływalne) również poza bash

Patrząc na skrypty powłoki, które zrobiłem w ciągu ostatnich kilku lat, mniej więcej przestałem pisać aliasy (ponieważ z czasem wszystkie stają się funkcjami) i wykonuję skrypty tylko wtedy, gdy muszą być dostępne również ze środowisk innych niż bash.

PS: Co do alias command="bash bashscriptname"tego, nie widzę żadnego powodu, aby to robić. Nawet jeśli bashscriptnamenie ma w PATH $, wystarczy proste alias c=/path/to/script.

nohillside
źródło
1
W alias command="bash bashscriptname"skrypcie niekoniecznie musi być wykonywalny; w tym alias c=/path/to/scriptmusi.
Martin - マ ー チ ン
Nie jest wcale prawdą, że funkcje są „dostępne tylko w Bash”. Jeśli chcesz powiedzieć, że jest to funkcja tylko Bash, jest to po prostu fałsz (powłoka Bourne'a i każda kompatybilna pochodna ma je); a jeśli chcesz powiedzieć, że są funkcją interaktywnych powłok, to też nie jest dokładne (chociaż aliasy, zmienne i funkcje zdefiniowane w pliku ładowanym przy uruchomieniu przez interaktywne powłoki oczywiście nie będą ładowane przez nieinteraktywne powłoki).
tripleee
@tripleee To znaczyło bardziej jak „nie można exec()
wywoływać
11

Oto kilka dodatkowych punktów na temat aliasów i funkcji:

  • Alias o tej samej nazwie i funkcja mogą współistnieć
  • Najpierw sprawdzana jest przestrzeń nazw aliasu (patrz pierwszy przykład)
  • aliasów nie można (nie) ustawiać w podpowłoce ani w środowisku nieinteraktywnym (patrz drugi przykład)

Na przykład:

alias f='echo Alias'; f             # prints "Alias"
function f { echo 'Function'; }; f  # prints "Alias"
unalias f; f                        # prints "Function"

Jak widzimy, istnieją oddzielne przestrzenie nazw dla aliasów i funkcji; więcej szczegółów można znaleźć za pomocą declare -A -p BASH_ALIASESi declare -f f, który drukuje ich definicje (obie są przechowywane w pamięci).

Przykład pokazujący ograniczenia aliasów:

alias a='echo Alias'
a        # OK: prints "Alias"
eval a;  # OK: prints "Alias"
( alias a="Nested"; a );  # prints "Alias" (not "Nested")
( unalias a; a );         # prints "Alias"
bash -c "alias aa='Another Alias'; aa"  # ERROR: bash: aa: command not found

Jak widzimy, aliasy nie są zagnieżdżane, w przeciwieństwie do funkcji. Ponadto ich użycie ogranicza się do sesji interaktywnych.

Na koniec zauważ, że możesz mieć dowolne obliczenia w aliasie, zadeklarując funkcję natychmiast wywołującą ją, tak jak:

alias a_complex_thing='f() { do_stuff_in_function; } f'

który jest już szeroko stosowany w przypadku aliasów Git. Zaletą takiego działania w stosunku do zadeklarowania funkcji jest to, że alias nie może być po prostu nadpisany przez zebranie (lub użycie .) skryptu, który zdarza się zadeklarować funkcję o tej samej nazwie.

leden
źródło
10

Kiedy napisać skrypt ...

  • Skrypty łączą komponenty oprogramowania (aka. Narzędzia, polecenia, procesy, pliki wykonywalne, programy) w bardziej złożone komponenty, które same mogą być złożone w jeszcze bardziej złożone komponenty.
  • Skrypty są zwykle wykonywane jako pliki wykonywalne, dzięki czemu można je wywoływać według nazwy. Po wywołaniu powstaje nowy podproces do uruchomienia skryptu. Kopie dowolnych exportedytowanych zmiennych i / lub funkcji są przekazywane wartościowo do skryptu. Zmiany tych zmiennych nie są przenoszone z powrotem do skryptu nadrzędnego.
  • Skrypty można również ładować (pozyskiwać) tak, jakby były częścią skryptu wywołującego. Jest to analogiczne do tego, co niektóre inne języki nazywają „importuj” lub „dołączaj”. Pozyskane są wykonywane w ramach istniejącego procesu. Nie powstaje żaden podproces.

Kiedy napisać funkcję ...

  • Funkcje są wstępnie załadowanymi skryptami powłoki. Działają nieco lepiej niż wywoływanie osobnego skryptu, ale tylko wtedy, gdy należy go odczytać z dysku mechanicznego. Dzisiejsza proliferacja dysków flash, dysków SSD i normalne buforowanie Linuksa w nieużywanej pamięci RAM sprawiają, że ta poprawa jest w dużej mierze niemożliwa do zmierzenia.
  • Funkcje służą jako podstawowy sposób bash na osiągnięcie modułowości, enkapsulacji i ponownego użycia. Poprawiają przejrzystość, niezawodność i łatwość konserwacji skryptów.
  • Reguły składniowe wywoływania funkcji są identyczne jak reguły wywoływania pliku wykonywalnego. Zamiast pliku wykonywalnego zostanie wywołana funkcja o tej samej nazwie co plik wykonywalny.
  • Funkcje są lokalne dla skryptu, w którym się znajdują.
  • Funkcje mogą być eksportowane ( kopiowane według wartości ), dzięki czemu można ich używać w tzw. Skryptach. Zatem funkcje rozprzestrzeniają się tylko do procesów potomnych, nigdy rodziców.
  • Funkcje tworzą polecenia wielokrotnego użytku, które często są składane w biblioteki (skrypt z tylko definicjami funkcji), które mogą być pozyskiwane przez inne skrypty.

Kiedy pisać alias ...

W skryptach, takich jak skrypty biblioteczne, czasami potrzebny jest alias dla funkcji, na przykład gdy nazwa funkcji jest zmieniana, ale wymagana jest kompatybilność wsteczna. Można to osiągnąć, tworząc prostą funkcję o starej nazwie, która przekazuje wszystkie argumenty do nowej funkcji ...

# A bash in-script 'alias'
function oldFunction () { newFunction "$@"; }
DocSalvager
źródło
9

Jeszcze jedna kwestia, o której nie wierzę, została podniesiona: funkcja jest wykonywana w kontekście procesu wywoływania, podczas gdy skrypt wyświetla nową powłokę.

Może to być ważne dla wydajności - funkcja jest szybsza, ponieważ nie działa fork()i exec(). W normalnych okolicznościach różnica jest trywialna, ale jeśli debugujesz system, który nie ma pamięci i rujnuje strony, może to mieć duże znaczenie.

Ponadto, jeśli chcesz zmodyfikować obecne środowisko powłoki, powinieneś użyć funkcji. Na przykład funkcja może zmienić wyszukiwanie poleceń $PATHdla bieżącej powłoki, ale skrypt nie może tego zrobić, ponieważ działa na kopii fork / exec $PATH.

Jan Steinman
źródło
Jak działa to rozpowszechnianie funkcji wśród dzieci?
HappyFace,
1
@HappyFace W Bash możesz użyć export -ffunkcji, choć dokładne jej wewnętrzne działanie jest nieco niejasne. Wierzę, że nie jest to przenośne do tradycyjnej powłoki Bourne'a.
tripleee
7

Skrypt i alias oraz skrypt i funkcja nie wykluczają się wzajemnie. Możesz zapisywać aliasy i funkcje w skryptach.

Skrypty są tylko kodem, który jest trwały . Przydatne funkcje i aliasy, których chcesz używać w przyszłości, są przechowywane w skryptach. Jednak skrypt jest często zbiorem więcej niż jednej funkcji.

Ponieważ aliasy nie są parametryzowane , są bardzo ograniczone; zwykle w celu zdefiniowania niektórych parametrów domyślnych.

Funkcja jest oddzielny element kodu , dobrze określone pojęcie kilku linii kodu, który nie może podzielić na mniejsze części, użyteczne; taki, który może być ponownie wykorzystany bezpośrednio lub inny przez inne funkcje.

nieznany użytkownik
źródło
5

Jeśli powinien być bardzo szybki, uczyń go aliasem lub funkcją.

Jeśli powinien być użyteczny poza preferowaną powłoką, uczyń go skryptem. 1

Jeśli wymaga argumentów, uczyń go funkcją lub skryptem.

Jeśli musi zawierać znaki specjalne, ustaw go jako alias lub skrypt. 2)

Jeśli musi współpracować z sudo, ustaw go jako alias lub skrypt. 3)

Jeśli chcesz to łatwo zmienić bez wylogowania i zalogowania, skrypt jest łatwiejszy. 4

Przypisy

1 Lub uczyń go pseudonimem, włóż go ~/.envi ustaw export ENV="$HOME/.env", ale skomplikowane jest, aby działało przenośnie.

2 Nazwy funkcji muszą być identyfikatorami, więc muszą zaczynać się od litery i mogą zawierać tylko litery, cyfry i znaki podkreślenia. Na przykład mam alias alias +='pushd +1'. To nie może być funkcja.

3 I dodaj alias alias sudo='sudo '. Podobnie jak inne polecenia, takie jak strace, gdbitp., Które przyjmują polecenie jako pierwszy argument.

4 Zobacz także: fpath. Oczywiście możesz to zrobić source ~/.bashrclub podobnie, ale często ma to inne skutki uboczne.

Mikel
źródło
1
Nie wiedziałem, że możesz pseudonim +w bash. Co ciekawe, po testach odkryłem, że w bash możesz utworzyć +alias, ale nie funkcję, jak mówisz, ale zsh jest na odwrót - +może być funkcją, ale nie aliasem.
Kevin
W zshmusisz pisać alias -- +='some command here'.
Mikel
Jakoś nie sądzę, że aliasing +jest przenośny. Zobacz specyfikację POSIX w Alias ​​Names
jw013,
3
Upvote za pokrycie sudoużycia. Jeśli chodzi o przypis 4, przechowuję moje aliasy ~/.bash_aliasesi definicje funkcji, ~/.bash_functionsaby móc sourceje łatwo zmienić (bez ryzyka skutków ubocznych).
Anthony Geoghegan
3

Wystarczy dodać kilka notatek:

  • Z sudo można używać tylko osobnego skryptu (np. Jeśli trzeba edytować plik systemowy), na przykład:
sudo v /etc/rc.conf  #where v runs vim in a new terminal window;
  • Tylko aliasy lub funkcje mogą zastąpić komendy systemowe o tej samej nazwie (zakładając, że dodajesz skrypty do końca PATH, co moim zdaniem jest zalecane ze względów bezpieczeństwa w przypadku przypadkowego lub złego tworzenia skryptu o nazwie identycznej z komendą systemową), na przykład:
alias ls='ls --color=auto'  #enable colored output;
  • Aliasy i funkcje wymagają mniej pamięci i czasu do wykonania, ale ładowanie zajmuje dużo czasu (ponieważ powłoka musi je zinterpretować przed wyświetleniem monitu). Weź to pod uwagę, jeśli regularnie uruchamiasz nowe procesy powłoki, na przykład:
# pressing key to open new terminal
# waiting for a few seconds before shell prompt finally appears.

Poza tym możesz użyć najprostszej możliwej formy, tj. Najpierw rozważ alias, potem funkcję, a potem skrypt.

Korwin
źródło
5
Aliasów można również używać z sudo. Ale najpierw potrzebujesz alias sudo='sudo '.
Mikel
Chociaż prawdą jest, że wykonanie skryptu zużyje chwilowo więcej pamięci na czas trwania fork + exec, załadowanie dużej ilości kodu do pamięci bieżącej instancji powłoki powoduje, że zużywa ona więcej pamięci, często do przechowywania kodu, który tylko rzadko się przyzwyczaja.
tripleee
2

Moja ogólna zasada brzmi:

  • aliasy - jedno polecenie, bez parametrów
  • funkcje - jedno polecenie niektóre parametry
  • skrypt - kilka poleceń, brak parametrów
Michael Durrant
źródło
1

W środowisku z wieloma użytkownikami (lub wieloma sysaminami) używam skryptów do wszystkiego, nawet jeśli jest to po prostu krótkie opakowanie typu „wykonaj coś ....”.

Oczywiście jest technicznie wolniejszy / mniej wydajny niż alias lub funkcja, ale to prawie nigdy nie ma znaczenia - i pod warunkiem, że znajdzie się na ścieżce, skrypt zawsze działa.

Twoja funkcja może być wywołana z crona, z czegoś ze zredukowanym lub zmodyfikowanym środowiskiem, takim jak sudo lub env, lub użytkownik może po prostu użyć innej powłoki niż ty - wszystko, co może uszkodzić alias lub funkcję.

Jeśli masz coś wrażliwego na wydajność, potraktuj to jako wyjątkowy przypadek lub jeszcze lepiej, rozważ wyzwalacz do przepisania w bardziej funkcjonalnym języku skryptowym.

Jeśli mówimy o funkcjach, które będą używane tylko w innych skryptach, możesz również rozważyć zdefiniowanie standardowej powłoki i napisanie takiego skryptu biblioteki funkcji. pozyskałem wszystkie inne skrypty.

T.

tjb63
źródło
0

Przykład sytuacji, w której najprawdopodobniej chcesz użyć aliasu.

Wiem, że to stary post, ale chciałbym zwrócić uwagę na sytuację, w której prawie musiałem użyć kombinacji aliasu ze skryptem i postanowiłem nie używać funkcji.

Mam ~/.bin/wywoływany skrypt, setupktóry wykonuje następujące czynności: 1

  1. prowadzi mnie do określonego katalogu.
  2. definiuje kilka zmiennych.
  3. drukuje wiadomości o stanie katalogu. 2)

Chodzi o to, że gdybym tylko uruchomił setup <project-name>, nie zdefiniowałbym tych zmiennych i w ogóle nie wszedłbym do katalogu. Rozwiązaniem, które uznałem za najlepsze, było dodanie tego skryptu PATHi dodanie alias setup=". ~/.bin/setup"go ~/.bashrclub cokolwiek innego.

Uwagi:

  1. Użyłem skryptu do tego zadania, a nie funkcji, nie dlatego, że jest on szczególnie długi, ale ponieważ mogę go edytować i nie muszę źródła pliku po edycji, jeśli chcę odświeżyć jego użycie.
  2. Podobny przypadek przypadł mi, gdy stworzyłem skrypt do przeładowania wszystkich plików dot. 3)
  1. Skrypt jest dostępny w moim repozytorium plików dotfiles pod .bin/.
  2. Informacje o skrypcie : Daję temu skryptowi argument, który jest nazwą projektu, który zdefiniowałem w zaawansowany sposób. Następnie skrypt wie, że powinien doprowadzić mnie do odpowiedniego katalogu zgodnie z określonym csvplikiem. Zmienne, które definiuje, są pobierane z makefile w tym katalogu. Skrypt uruchamia się później ls -li git statuspokazuje mi, co się tam dzieje.
  3. Ten skrypt jest również dostępny w moim repozytorium plików dotfiles .bin/.
Doron Behar
źródło
1
Hm, wydaje się, że powinna to być po prostu funkcja, a nie kombinacja alias-skrypt. (BTW, środowiska są pisane „środowiska”, a nie „środowisko”.)
Wildcard,
Dzięki za komentowanie literówki, naprawię to przy następnym zatwierdzeniu. Jeśli chodzi o użycie funkcji zamiast skryptu - być może użyję funkcji do tego konkretnego zadania i usunę te aliasy. Chodzi o to, że czasami dość łatwo jest używać skryptu i aliasu, jeśli od czasu do czasu edytujesz ten skrypt .
Doron Behar,
0

Kiedy pisać skrypt

Gdy możesz chcieć uruchomić polecenie z narzędzia innego niż powłoka.

Obejmuje to vim (dla mnie): mając napisane filtry i inne programy jako skrypty, mogę zrobić coś takiego jak :%!my-filterfiltrowanie pliku przez program z mojego edytora.

Gdyby my-filterbyła funkcja lub alias, nie byłoby to możliwe.

D. Ben Knoble
źródło