Wann in Bash einen Alias ​​erstellen, wann ein Skript erstellen und wann eine Funktion schreiben?

360

Es hat mich fast 10 Jahre Linux-Erfahrung gekostet, diese Frage zu stellen. Es war alles Versuch und Irrtum und zufälliges nächtliches Surfen im Internet.

Aber die Leute sollten dafür keine 10 Jahre brauchen. Wenn ich gerade mit Linux anfangen würde, würde ich wissen wollen: Wann sollte ein Alias ​​erstellt, wann ein Skript erstellt und wann eine Funktion geschrieben werden?

Wenn es um Aliase geht, verwende ich Aliase für sehr einfache Operationen, für die keine Argumente erforderlich sind.

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

Das scheint offensichtlich. Aber einige Leute machen das:

alias command="bash bashscriptname"

(und zur .bashrcDatei hinzufügen )

Gibt es einen guten Grund dafür? Ich bemühe mich sehr, aber ich kann mir wirklich keine Umstände vorstellen, unter denen ich das tun möchte. Wenn es also einen Randfall gibt, bei dem dies einen Unterschied machen würde, antworten Sie bitte unten.

Denn hier habe ich einfach etwas in meinen PATH und chmod +xdas hier eingefügt, was auch nach Jahren des Versuchs und Irrtums unter Linux der Fall war.

Das bringt mich zum nächsten Thema. Zum Beispiel habe ich .scripts/meinem PATH einen versteckten Ordner ( ) im Home-Verzeichnis hinzugefügt, indem ich einfach eine Zeile zu my .bashrc( PATH=$PATH:/home/username/.scripts/) hinzugefügt habe , damit alle darin enthaltenen ausführbaren Dateien automatisch vervollständigt werden.

Wenn ich müsste.

Das brauche ich aber nicht wirklich, oder? Ich würde das nur für Sprachen verwenden, die nicht die Shell sind, wie Python.

Wenn es die Shell ist, kann ich einfach eine Funktion innerhalb derselben schreiben .bashrc:

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

Wie ich bereits sagte, habe ich viel durch Ausprobieren herausgefunden. Und ich habe die Schönheit der Funktionen erst wirklich gesehen, als mein Computer starb und ich gezwungen war, die Computer der Leute um mich herum zu benutzen, wenn sie sie nicht benutzten.

Anstatt ein ganzes Verzeichnis von Skripten von Computer zu Computer zu verschieben, habe ich letztendlich nur die .bashrc aller anderen durch meine eigene ersetzt, da sie noch nie eine einzige Änderung vorgenommen hatten.

Aber habe ich etwas verpasst?

Also, was würden Sie einem Linux-Anfänger darüber sagen, wann ein Alias ​​erstellt, wann ein Skript erstellt und wann eine Funktion geschrieben werden soll?

Wenn es nicht offensichtlich ist, gehe ich davon aus, dass die Personen, die darauf antworten, alle drei Optionen nutzen werden. Wenn Sie nur Aliase oder nur Skripte verwenden oder nur Funktionen verwenden - oder wenn Sie nur Aliase und Skripte oder Aliase und Funktionen oder Skripte und Funktionen verwenden - richtet sich diese Frage nicht wirklich an Sie.

ixtmixilix
quelle
5
Mögliche Duplikate von Bash-Funktionen vs Skripte
Gilles
10
+1 für die explizite Angabe aller Teilmengen von {alias, script, function}, auf die diese Frage nicht zielt. +1 für den kindlichen Glauben, dass es in Ordnung war, die Null-Teilmenge wegzulassen.
Thomas L Holaday
1
Beachten Sie, dass ältere Bourne-Shells zwar einen Alias, aber keine Funktionen hatten, obwohl die Frage speziell nach Bash gestellt wurde. Dies kann einen Unterschied machen, wenn Sie Bedenken hinsichtlich der Kompatibilität haben.
AndyB
Ist .bashrc wirklich der beste Ort oder zumindest ein solider Ort dafür? Unter Linux gibt es so viele Möglichkeiten, dasselbe zu tun. Ich schätze jedoch, dass alle Dinge gleich sind. Ich bevorzuge es, Dinge auf die übliche Weise zu tun.
Kit10,

Antworten:

242

Ein Alias ​​sollte (im Allgemeinen) nicht mehr als die Standardoptionen eines Befehls ändern. Es ist nichts weiter als eine einfache Ersetzung des Befehlsnamens. Es kann nichts mit Argumenten anfangen, sondern sie an den Befehl übergeben, den es tatsächlich ausführt. Wenn Sie also einfach ein Argument vor einem einzelnen Befehl einfügen müssen, funktioniert ein Alias. Häufige Beispiele sind

# 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"

Eine Funktion sollte verwendet werden, wenn Sie komplexere Aufgaben als einen Alias ​​ausführen müssen, dies allein jedoch nicht von Nutzen wäre. Nehmen Sie diese Antwort zum Beispiel auf eine Frage, die ich zum Ändern grepdes Standardverhaltens gestellt habe, je nachdem, ob es sich in einer Pipeline befindet:

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

Dies ist ein perfektes Beispiel für eine Funktion, da sie für einen Alias ​​zu komplex ist (je nach Bedingung sind unterschiedliche Standardeinstellungen erforderlich), in einem nicht interaktiven Skript jedoch nicht erforderlich ist.

Wenn Sie zu viele oder zu große Funktionen erhalten, speichern Sie diese in separaten Dateien in einem versteckten Verzeichnis und geben Sie sie in Ihrem ~/.bashrc:

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

Ein Skript sollte für sich alleine stehen. Es sollte einen Wert haben, der wiederverwendet oder für mehr als einen Zweck verwendet werden kann.

Kevin
quelle
14
Beachten Sie auch, dass ein Skript - sofern es nicht mit .oder bereitgestellt wird source- von einem separaten Bash-Prozess ausgeführt wird und über eine eigene Umgebung verfügt. Aus diesem Grund bleibt alles, was die Shell-Umgebung verändert (z. B. Funktionen, Variablen usw.), in der Shell-Umgebung, in der Sie das Skript ausführen, nicht erhalten.
Will Vousden
260

Die anderen Antworten enthalten einige allgemeine Richtlinien, die sich nach dem persönlichen Geschmack richten, ignorieren jedoch viele relevante Fakten , die bei der Entscheidung zwischen Skripten, Funktionen oder Aliasen berücksichtigt werden sollten.

Aliase und Funktionen ¹

  • Der gesamte Inhalt der Aliase und Funktionen wird im Speicher der Shell gespeichert.
  • Eine natürliche Folge davon ist, dass Aliase und Funktionen nur von der aktuellen Shell verwendet werden können und nicht von anderen Programmen, die Sie aus der Shell aufrufen, wie Texteditoren, Skripten oder sogar untergeordneten Instanzen derselben Shell.
  • Aliase und Funktionen werden von der aktuellen Shell ausgeführt, dh sie werden in der aktuellen Umgebung der Shell ausgeführt und wirken sich auf diese aus.² Es ist kein separater Prozess erforderlich, um einen Alias ​​oder eine Funktion auszuführen.

Skripte

  • Shells speichern keine Skripte im Speicher. Stattdessen werden Skripte jedes Mal, wenn sie benötigt werden, aus den Dateien gelesen, in denen sie gespeichert sind. Wenn das Skript über eine $PATHSuche gefunden wird, speichern viele Shells einen Hash seines Pfadnamens im Speicher, um Zeit bei zukünftigen Suchen zu sparen. $PATHDies ist jedoch der Umfang des Speicherbedarfs eines Skripts, wenn es nicht verwendet wird.
  • Skripte können auf mehr Arten aufgerufen werden als Funktionen und Aliase. Sie können als Argument an einen Interpreter übergeben werden, z. B. sh scriptoder direkt als ausführbare Datei aufgerufen werden. In diesem Fall wird der Interpreter in der Shebang-Zeile (z. B. #!/bin/sh) aufgerufen, um sie auszuführen. In beiden Fällen wird das Skript von einem separaten Interpreter-Prozess mit einer eigenen Umgebung ausgeführt, die von der Ihrer Shell getrennt ist und deren Umgebung das Skript in keiner Weise beeinflussen kann. In der Tat muss die Interpreter-Shell nicht einmal mit der aufrufenden Shell übereinstimmen. Da sich auf diese Weise aufgerufene Skripte wie normale ausführbare Dateien verhalten, können sie von jedem Programm verwendet werden.

    Schließlich kann ein Skript von der aktuellen Shell mit .oder in einigen Shells gelesen und ausgeführt werden source. In diesem Fall verhält sich das Skript ähnlich wie eine Funktion, die bei Bedarf gelesen wird, anstatt ständig im Speicher zu bleiben.

Anwendung

In Anbetracht der obigen Ausführungen können wir einige allgemeine Richtlinien für die Erstellung eines Skripts oder einer Funktion / eines Alias ​​erstellen.

  • Müssen andere Programme als Ihre Shell in der Lage sein, es zu benutzen? Wenn ja, muss es ein Skript sein.

  • Möchten Sie nur, dass es über eine interaktive Shell verfügbar ist? Es ist üblich, das Standardverhalten vieler Befehle zu ändern, wenn sie interaktiv ausgeführt werden, ohne externe Befehle / Skripte zu beeinflussen. Für diesen Fall verwenden Sie eine Alias / Funktion in dem „interactive-mode-only“ Shell gesetzt rc - Datei ( bashdas ist .bashrc).

  • Muss die Umgebung der Shell geändert werden? Es können sowohl eine Funktion / ein Alias ​​als auch ein bezogenes Skript ausgewählt werden.

  • Verwenden Sie es häufig? Es ist wahrscheinlich effizienter, es im Speicher zu behalten, machen Sie es also zu einer Funktion / einem Alias, wenn möglich.

  • Verwenden Sie es dagegen nur selten? In diesem Fall macht es keinen Sinn, es als Schweinespeicher zu verwenden, wenn Sie es nicht benötigen. Machen Sie es also zu einem Skript.


¹ Obwohl Funktionen und Aliase einige wichtige Unterschiede aufweisen, werden sie zusammengefasst, da Funktionen alles können, was Aliase können. Aliase können keine lokalen Variablen haben oder Argumente verarbeiten und sind für alles, was länger als eine Zeile ist, unpraktisch.

² Jeder ausgeführte Prozess in einem Unix-System verfügt über eine Umgebung, die aus einer Reihe von variable=valuePaaren besteht, die häufig globale Konfigurationseinstellungen enthalten, z. B. LANGfür das Standardgebietsschema und PATHzur Angabe des ausführbaren Suchpfads.

jw013
quelle
26
IMHO Dies ist die beste Antwort.
Luc M
4
Das Frage / Antwort-Format ist eine großartige Idee. Ich könnte das stehlen. ;-)
Mikel
4
Bemerkenswert: Wenn zwei (oder mehr) Skripte Code gemeinsam nutzen müssen, ist es wahrscheinlich am besten, diesen Code in eine Funktion zu schreiben, die sich in einer dritten Datei befindet, die beide Skripte importieren / aus der sie stammen.
kbolino
3
Ein weiterer Punkt, der zu dieser Liste von Fragen hinzugefügt werden muss: Müssen Sie jemals die Funktionalität des Befehls im laufenden Betrieb ändern? Änderungen an einem Skript werden in allen Sitzungen berücksichtigt, während Funktionen und Aliase für jede Sitzung neu geladen oder neu definiert werden müssen.
Stratus3D
3
Gute Antwort. Noch eine wichtige Sache (für mich): Wenn Sie eine "Verknüpfung" zu anderen Utils erstellen, ist es besser, einen Alias ​​zu verwenden, da die vorhandene Autovervollständigung nur mit Aliasen funktioniert, nicht aber mit Skripten oder Funktionen (also +1 für Aliase). Beispiel: Durch das Erstellen eines wird alias g='gradle'bei Verwendung meines gAlias eine gradle-Autovervollständigung durchgeführt , bei Verwendung eines Skripts mit gradle $*oder einer Funktion mitgradle $@
Yoav Aharoni
37

Ich denke, es liegt an jedem Geschmack. Für mich lautet die Logik wie folgt:

  • Zuerst versuche ich einen Alias ​​zu erstellen, weil es am einfachsten ist.
  • Wenn das Ding zu kompliziert ist, um in eine Zeile zu passen, versuche ich, es zu einer Funktion zu machen.
  • Wenn die Funktion mehr als ein Dutzend Zeilen umfasst, habe ich sie in ein Skript eingefügt.

Es gibt wirklich nichts, was Sie daran hindert, etwas zu tun, das funktioniert .

phunehehe
quelle
6
Ich überspringe oft die Funktionsoption und erstelle sofort ein Skript. Aber ich stimme zu, dass es teilweise Geschmackssache ist
Bernhard
2
Eine Funktion macht Sinn, wenn Sie sie in mehreren Skripten benötigen.
Nils
7
... oder wenn Sie die Nebenwirkungen benötigen, um die aktuelle Shell zu verändern .
Glenn Jackman
macht Sinn, Mann!
Explorer
15

Zumindest teilweise ist es eine Frage des persönlichen Geschmacks. Auf der anderen Seite gibt es einige klare funktionale Unterschiede:

  • Aliase: Nur für einfache Textersetzungen geeignet, keine Argumente / Parameter
  • Funktionen: einfach zu schreiben / zu verwenden, volle Shell-Scripting-Fähigkeit, nur innerhalb von Bash verfügbar
  • Skripte: mehr oder weniger wie Funktionen, aber auch außerhalb von Bash verfügbar (aufrufbar)

In den letzten Jahren habe ich mehr oder weniger aufgehört, Aliase zu schreiben (weil sie alle im Laufe der Zeit zu Funktionen werden) und Skripte nur dann zu erstellen, wenn sie auch in Nicht-Bash-Umgebungen verfügbar sein müssen.

PS: alias command="bash bashscriptname"Ich sehe keinen Grund, dies zu tun. Auch wenn bashscriptnamenicht in $ PATH steht, würde ein einfaches alias c=/path/to/scriptausreichen.

Nohillside
quelle
1
Im alias command="bash bashscriptname"Skript muss nicht unbedingt ausführbar sein; in der alias c=/path/to/scriptmuss es sein.
Martin - マ マ チ ン
Es ist überhaupt nicht wahr, dass Funktionen "nur in Bash verfügbar" sind. Wenn Sie sagen möchten, dass es sich um eine reine Bash-Funktion handelt, ist dies einfach falsch (die Bourne-Shell und jedes kompatible Derivat haben sie). und wenn Sie damit sagen wollen, dass sie ein Merkmal interaktiver Shells sind, ist dies ebenfalls nicht korrekt (obwohl Aliase, Variablen und Funktionen, die in einer Datei definiert sind, die beim Start von interaktiven Shells geladen wird, offensichtlich nicht von nicht interaktiven Shells geladen werden).
Tripleee
@ Tripleee Die Bedeutung war eher wie "Sie können nicht exec()Shell-Funktionen" :-)
Nohillside
11

Hier einige zusätzliche Punkte zu Aliasen und Funktionen:

  • Gleichnamiger Alias ​​und Funktion können nebeneinander existieren
  • alias Namespace nachgeschlagen ersten (siehe erstes Beispiel)
  • Aliase können in Subshells oder nicht interaktiven Umgebungen nicht (un) gesetzt werden (siehe zweites Beispiel)

Zum Beispiel:

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

Wie wir sehen können, gibt es separate Namespaces für Aliase und Funktionen. Weitere Details finden Sie mit declare -A -p BASH_ALIASESund declare -f f, die ihre Definitionen ausdrucken (beide sind im Speicher abgelegt).

Beispiel mit Einschränkungen von Aliasen:

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

Wie wir sehen können, sind Aliase im Gegensatz zu Funktionen nicht verschachtelbar. Außerdem ist ihre Verwendung auf die interaktiven Sitzungen beschränkt.

Beachten Sie zum Schluss, dass Sie eine beliebige Berechnung in einem Alias ​​durchführen können, indem Sie eine Funktion deklarieren und sofort aufrufen, wie folgt:

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

was bei Git-Aliasen bereits weit verbreitet ist. Dies hat gegenüber der Deklaration einer Funktion den Vorteil, dass Ihr Alias ​​nicht einfach überschrieben werden kann, indem Sie .ein Skript als Quelle angeben (oder verwenden ), das zufällig eine Funktion mit demselben Namen deklariert.

leden
quelle
10

Wann schreibe ich ein Skript ...

  • Skripte setzen Softwarekomponenten (auch bekannt als Werkzeuge, Befehle, Prozesse, ausführbare Dateien, Programme) zu komplexeren Komponenten zusammen, die selbst zu noch komplexeren Komponenten zusammengesetzt werden können.
  • Skripte werden normalerweise ausführbar gemacht, damit sie nach Namen aufgerufen werden können. Beim Aufruf wird ein neuer Unterprozess erzeugt, in dem das Skript ausgeführt werden kann. Kopien von exported-Variablen und / oder -Funktionen werden als Wert an das Skript übergeben. Änderungen an diesen Variablen werden nicht an das übergeordnete Skript weitergegeben.
  • Skripte können auch so geladen (bezogen) werden, als ob sie Teil des aufrufenden Skripts wären. Dies ist analog zu dem, was einige andere Sprachen als "import" oder "include" bezeichnen. Wenn sie bezogen werden, werden sie innerhalb des vorhandenen Prozesses ausgeführt. Es wird kein Unterprozess erzeugt.

Wann schreibe ich eine Funktion ...

  • Funktionen sind effektiv vorinstallierte Shell-Skripte. Sie sind etwas leistungsfähiger als das Aufrufen eines separaten Skripts, jedoch nur, wenn es von einer mechanischen Festplatte gelesen werden muss. Die heutige Verbreitung von Flash-Laufwerken, SSDs und das normale Zwischenspeichern von Linux in ungenutztem RAM machen diese Verbesserung weitgehend unermesslich.
  • Funktionen dienen als Hauptmittel von bash, um Modularität, Kapselung und Wiederverwendung zu erreichen. Sie verbessern die Klarheit, Zuverlässigkeit und Wartbarkeit von Skripten.
  • Die Syntaxregeln zum Aufrufen einer Funktion sind identisch mit denen zum Aufrufen einer ausführbaren Datei. Eine Funktion mit demselben Namen wie eine ausführbare Datei wird anstelle der ausführbaren Datei aufgerufen.
  • Funktionen sind lokal für das Skript, in dem sie sich befinden.
  • Funktionen können exportiert ( nach Wert kopiert ) werden, damit sie in aufgerufenen Skripten verwendet werden können. Funktionen breiten sich daher nur auf untergeordnete Prozesse aus, nicht auf übergeordnete.
  • Funktionen erstellen wiederverwendbare Befehle, die häufig in Bibliotheken zusammengefasst werden (ein Skript mit nur Funktionsdefinitionen), die von anderen Skripten bereitgestellt werden.

Wann soll ein Alias ​​geschrieben werden?

In Skripten wie Bibliotheksskripten wird manchmal ein Alias ​​für eine Funktion benötigt, z. B. wenn eine Funktion umbenannt wird, aber Abwärtskompatibilität erforderlich ist. Dies kann erreicht werden, indem eine einfache Funktion mit dem alten Namen erstellt wird, die alle ihre Argumente an die neue Funktion übergibt ...

# A bash in-script 'alias'
function oldFunction () { newFunction "$@"; }
DocSalvager
quelle
9

Eine andere Sache, von der ich nicht glaube, dass sie angesprochen wurde: Eine Funktion wird im Kontext des aufrufenden Prozesses ausgeführt, während ein Skript eine neue Shell aufgibt.

Dies kann für die Leistung wichtig sein - eine Funktion ist schneller, da dies nicht der Fall ist fork()und exec(). Unter normalen Umständen ist der Unterschied trivial. Wenn Sie jedoch ein System debuggen, dessen Arbeitsspeicher knapp wird und das überfüllt ist, kann dies einen großen Unterschied bewirken.

Wenn Sie Ihre aktuelle Shell-Umgebung ändern möchten, sollten Sie auch eine Funktion verwenden. Beispielsweise kann eine Funktion die Befehlssuche $PATHfür die aktuelle Shell ändern , ein Skript jedoch nicht, da es auf einer Fork / Exec-Kopie von ausgeführt wird $PATH.

Jan Steinman
quelle
Wie funktioniert diese Weitergabe von Funktionen an Kinder?
HappyFace
1
@HappyFace In Bash können Sie export -feine Funktion ausführen , obwohl das genaue Innenleben etwas unklar ist. Dies ist meiner Meinung nach nicht auf traditionelle Bourne-Shell übertragbar.
Tripleee
7

Skript und Alias ​​sowie Skript und Funktion schließen sich nicht gegenseitig aus. Sie können Aliase und Funktionen in Skripten speichern.

Skripte sind nur Code, der persistent gemacht wird . Nützliche Funktionen und Aliase, die Sie in Zukunft gerne verwenden, werden in Skripten gespeichert. Ein Skript ist jedoch häufig eine Sammlung von mehr als einer Funktion.

Da Aliase nicht parametrisiert sind , sind sie sehr begrenzt. normalerweise, um einige Standardparameter zu definieren.

Eine Funktion ist eine separate Codeeinheit , ein genau definiertes Konzept einiger Codezeilen, die nicht in kleinere, nützliche Teile unterteilt werden können. eine, die von anderen Funktionen direkt oder anderweitig wiederverwendet werden kann.

Benutzer unbekannt
quelle
5

Wenn es sehr schnell sein soll, machen Sie es zu einem Alias ​​oder einer Funktion.

Wenn es außerhalb Ihrer bevorzugten Shell verwendet werden soll, machen Sie es zu einem Skript. 1

Wenn es Argumente braucht, machen Sie es zu einer Funktion oder einem Skript.

Wenn es Sonderzeichen enthalten muss, machen Sie es zu einem Alias ​​oder einem Skript. 2

Wenn es mit sudo arbeiten muss, machen Sie es zu einem Alias ​​oder einem Skript. 3

Wenn Sie es einfach ändern möchten, ohne sich aus- und einzuloggen, ist ein Skript einfacher. 4

Fußnoten

1 Oder machen Sie es zu einem Alias, fügen Sie es ein und legen Sie es ~/.envfest export ENV="$HOME/.env", aber es ist kompliziert, es portabel zu machen.

2 Funktionsnamen müssen Bezeichner sein, daher müssen sie mit einem Buchstaben beginnen und dürfen nur Buchstaben, Ziffern und Unterstriche enthalten. Zum Beispiel habe ich einen Alias alias +='pushd +1'. Es kann keine Funktion sein.

3 Fügen Sie den Alias ​​hinzu alias sudo='sudo '. Dito anderer Befehl wie strace, gdbetc. , die einen Befehl als erstes Argument annimmt.

4 Siehe auch: Pfad. Natürlich können Sie auch tun source ~/.bashrcoder ähnliches, aber dies hat oft andere Nebenwirkungen.

Mikel
quelle
1
Ich wusste nicht, dass Sie Alias +in Bash können. Interessanterweise habe ich nach dem Testen festgestellt, dass Sie in bash +einen Alias +erstellen können, aber keine Funktion, wie Sie sagen, aber zsh ist das Gegenteil - kann eine Funktion sein, aber kein Alias.
Kevin
In zshmusst du schreiben alias -- +='some command here'.
Mikel
Irgendwie halte ich Aliasing nicht für +portabel. Siehe die POSIX-Spezifikation für Alias-Namen
jw013
3
Upvote für die Deckung der sudoNutzung. In Bezug auf Fußnote 4 speichere ich meine Aliase ~/.bash_aliasesund Funktionsdefinitionen, ~/.bash_functionsdamit ich sie leicht wieder herstellen sourcekann (ohne die Gefahr von Nebenwirkungen).
Anthony Geoghegan
3

Nur um ein paar Anmerkungen hinzuzufügen:

  • Mit sudo kann nur ein separates Skript verwendet werden (zum Beispiel, wenn Sie eine Systemdatei bearbeiten müssen):
sudo v /etc/rc.conf  #where v runs vim in a new terminal window;
  • Nur Aliase oder Funktionen können Systembefehle mit demselben Namen ersetzen (vorausgesetzt, Sie fügen Ihr Skriptverzeichnis am Ende von PATH hinzu, was aus Sicherheitsgründen für den Fall empfehlenswert ist, dass versehentlich oder böswillig ein Skript erstellt wird, dessen Name mit einem Systembefehl identisch ist). zum Beispiel:
alias ls='ls --color=auto'  #enable colored output;
  • Aliase und Funktionen benötigen weniger Speicherplatz und Zeit für die Ausführung, benötigen jedoch Zeit zum Laden (da die Shell sie alle interpretieren muss, bevor sie Ihnen die Eingabeaufforderung anzeigt). Berücksichtigen Sie dies, wenn Sie regelmäßig neue Shell-Prozesse ausführen, zum Beispiel:
# pressing key to open new terminal
# waiting for a few seconds before shell prompt finally appears.

Ansonsten können Sie die einfachste Form verwenden, dh zuerst Alias, dann Funktion, dann Skript.

corvinus
quelle
5
Aliase können auch mit verwendet werden sudo. Aber zuerst brauchst du alias sudo='sudo '.
Mikel
Es ist zwar richtig, dass das Ausführen eines Skripts für die Dauer von fork + exec vorübergehend mehr Speicher beansprucht. Wenn jedoch viel Code in den Speicher der aktuellen Shell-Instanz geladen wird, wird in Zukunft mehr Speicher beansprucht, häufig nur für das Speichern von Code wird ziemlich selten verwendet.
Tripleee
2

Meine Faustregel lautet:

  • Aliase - ein Befehl, keine Parameter
  • funktionen - ein befehl einige parameter
  • Skript - mehrere Befehle, keine Parameter
Michael Durrant
quelle
1

In einer Mehrbenutzerumgebung (oder Multi-Sysamin-Umgebung) verwende ich Skripte für alles, auch wenn es nur ein kurzer Wrapper für 'exec something ....' ist.

Sicher, es ist technisch langsamer / weniger effizient als ein Alias ​​oder eine Funktion, aber das spielt fast keine Rolle - und vorausgesetzt, es befindet sich im Pfad, funktioniert ein Skript immer.

Ihre Funktion wird möglicherweise von cron aus aufgerufen, von etwas mit einer reduzierten oder geänderten Umgebung wie sudo oder env, oder der Benutzer verwendet nur eine andere Shell als Sie - alles oder was wahrscheinlich einen Alias ​​oder eine Funktion beschädigen wird.

Wenn Sie etwas Leistungskritisches haben, behandeln Sie dies als Sonderfall oder, noch besser, als Auslöser für das Neuschreiben in einer funktionaleren Skriptsprache.

Wenn es sich um Funktionen handelt, die nur in anderen Skripten verwendet werden, können Sie auch eine Standard-Shell definieren und ein Funktionsbibliotheks-Skript schreiben, das nur so sein kann. Ich habe auf alle anderen Skripte zugegriffen.

T

tjb63
quelle
0

Ein Beispiel für eine Situation, in der Sie höchstwahrscheinlich einen Alias ​​verwenden möchten.

Ich weiß, dass dies ein alter Beitrag ist, aber ich möchte auf eine Situation hinweisen, in der ich fast eine Kombination aus Aliasnamen und einem Skript verwenden musste und mich dafür entschieden habe, keine Funktion zu verwenden.

Ich habe ein Skript ~/.bin/aufgerufen setup, das Folgendes tut: 1

  1. bringt mich in ein bestimmtes Verzeichnis.
  2. definiert ein paar Variablen.
  3. druckt Nachrichten über den Zustand des Verzeichnisses. 2

Der Punkt ist, dass ich, wenn ich nur laufen setup <project-name>würde, diese Variablen nicht definiert hätte und überhaupt nicht in das Verzeichnis gekommen wäre. Die Lösung fand ich das Beste sein war dieses Skript hinzuzufügen , PATHund fügen Sie alias setup=". ~/.bin/setup"zu ~/.bashrcoder was auch immer.

Anmerkungen:

  1. Ich habe für diese Aufgabe ein Skript und keine Funktion verwendet, nicht weil sie besonders lang ist, sondern weil ich sie bearbeiten kann und die Datei nach einer Bearbeitung nicht als Quelle verwenden muss, wenn ich ihre Verwendung aktualisieren möchte.
  2. Ein ähnlicher Fall ist mir aufgefallen, als ich ein Skript zum Neuladen aller meiner Punktedateien erstellt habe. 3
  1. Das Skript ist in meinem Dotfiles-Repository unter verfügbar .bin/.
  2. Über das Skript : Ich gebe diesem Skript ein Argument, das ein Name für das Projekt ist, das ich in advanced definiert habe. Danach weiß das Skript, dass es mich gemäß einer bestimmten csvDatei in das richtige Verzeichnis bringt . Die von ihm definierten Variablen werden aus dem Makefile in diesem Verzeichnis übernommen. Das Skript wird anschließend ausgeführt ls -lund git statuszeigt mir, was dort vor sich geht.
  3. Dieses Skript ist auch in meinem Dotfiles-Repository unter verfügbar .bin/.
Doron Behar
quelle
1
Hm, das sollte wohl nur eine Funktion sein, keine Alias-Skript-Kombination. (Übrigens wird Umgebungen "Umgebungen" nicht "Umgebungen" geschrieben.)
Wildcard
Vielen Dank, dass Sie sich zu dem Tippfehler geäußert haben. Ich werde ihn beim nächsten Commit korrigieren. Was die Verwendung einer Funktion anstelle eines Skripts betrifft, verwende ich möglicherweise eine Funktion für diese bestimmte Aufgabe und lösche diese Aliase. Der Punkt ist, dass es manchmal recht einfach ist, ein Skript und einen Alias ​​zu verwenden, wenn Sie dieses Skript von Zeit zu Zeit bearbeiten .
Doron Behar
0

Wann soll ein Skript geschrieben werden?

Wenn Sie den Befehl möglicherweise von einem anderen Tool als der Shell ausführen möchten.

Dies schließt vim (für mich) ein: Wenn ich Filter und andere Programme als Skripte geschrieben habe, kann ich so etwas wie :%!my-filterdas Filtern einer Datei durch das Programm von meinem Editor aus tun .

Wenn my-filtereine Funktion oder ein Alias ​​vorhanden wäre, wäre dies nicht möglich.

D. Ben Knoble
quelle