Was ist der Unterschied zwischen alias-und export (und Funktion!)[BASH]?
Ich bin überrascht, dass noch nicht gefragt worden, bevor, aber...
Was ist der Unterschied zwischen
alias ⇢ alias EXPORT='alias'
Funktion ⇢ function exporter() { echo $EXPORT }
und
export ⇢ export ALIAS='export'
und für diese Angelegenheit...
alias export=$(function)
(j/k)
in bash
(zsh
, et al.)
Speziell, ich würde mich am meisten interessieren, zu wissen, die lexikalische/praktische Unterschied zwischen
alias this=that
und
export that=this
Habe ich beide Formen... alle über dem Platz - und würde am Liebsten aufhören, willkürlich die Wahl des einen über den anderen. ?
Ich bin sicher, es ist eine gute Referenz, um eine "Bereiche und Anwendungsfälle für die unix-shells", irgendwo... aber dachte, ich würde post, die Frage ist hier, im Namen der gerechte-canonicalicism.
- Ich bin mir sicher, dass es schon gefragt und beantwortet bevor.
- Außerdem fürchte ich, dass die Art, wie deine Frage formuliert ist, scheint es zu weit.
- links.mrgray.com/doesntexist
- Leider ist dein Beispiel nicht helfen, zu verstehen, was deine Frage ist oder was du versuchst zu erreichen.
- Als Allgemeine Regel gilt, immer lieber Funktionen, die über Aliase (es sei denn, Sie wissen, dass ein alias ist vorzuziehen, die nur sehr selten passiert).
- Ihr Profil deutet darauf hin, dass Sie vertraut sind mit C. könnte Man denken, dass der Aliase wird ähnlich wie
#define
s und Funktionen sind wie, natürlich, Funktionen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du fragst nach den zwei sehr unterschiedliche Kategorien von Dingen: - Aliase und Funktionen definieren Sie die Dinge, die wirken wie Befehle;
export
markiert eine variable exportiert werden Kind-Prozesse. Lassen Sie mich gehen Sie durch den Befehl-wie die Dinge zuerst:Einen alias (
alias ll='ls -l'
) definiert ein Kürzel für einen Befehl. Sie sind gedacht für interaktive Nutzung (eigentlich sind Sie standardmäßig deaktiviert in shell-Skripten), und sind einfach, aber unflexibel. Zum Beispiel, alle Argumente, die Sie angeben, nachdem Sie den alias einfach geheftet auf das Ende des Befehls; wenn Sie wollten, so etwas wiealias findservice='grep "$1" /etc/services'
können Sie es nicht tun, weil$1
nichts nützliches hier.Funktion ist wie eine flexiblere, leistungsfähigere version von alias. Funktionen können nehmen & Prozess-Argumente, Schleifen, Bedingungen, die hier-Dokumente, etc... im Grunde alles, was Sie tun könnten, mit einem shell-script kann man in einer Funktion. Beachten Sie, dass der standard-Weg, um eine Funktion definieren, die nicht tatsächlich mit dem Schlüsselwort
function
nur Klammern nach dem Namen. Zum Beispiel:findservice() { grep "$1" /etc/services; }
Ok, jetzt auf shell-Variablen. Bevor ich zu
export
ich darüber reden müssen unexported Variablen. Grundsätzlich können Sie eine variable definieren, die einige (text -) Wert, und dann, wenn Sie beziehen sich auf die variable$variablename
es werden ersetzt in der Befehl. Dies unterscheidet sich von einer alias oder Funktion auf zwei Arten: ein alias oder Funktion kann nur auftreten, als das erste Wort in dem Befehl (z.B.ll filename
wird die Verwendung des aliasll
, aberecho ll
wird nicht), und die Variablen müssen explizit aufgerufen werden mit$
(echo $foo
wird, verwenden Sie die variable foo, aberecho foo
nicht). Mehr grundlegend, Aliase und Funktionen sind vorgesehen, um ausführbaren code enthalten (Kommandos, shell-syntax, etc), während die Variablen sind vorgesehen zum speichern von nicht-ausführbaren Daten.(BTW, Sie sollten fast immer setzen die variable Verweise in doppelten Anführungszeichen -, dass ist, verwenden Sie
echo "$foo"
statt nurecho $foo
. Ohne doppelte Anführungszeichen der variable Inhalt bekommen, analysiert in einer etwas seltsamen Art und Weise, die dazu neigt, zu verursachen bugs.)Gibt es auch einige "spezielle" shell-Variablen, die werden automatisch von der shell (z.B.
$HOME
), oder beeinflussen, wie die shell verhält (z.B.$PATH
steuert, wo es sucht nach ausführbaren Kommandos), oder beides.Einer
export
ed-variable ist sowohl in der aktuellen shell, und auch übergeben alle Teilprozesse (Unterschalen, anderen Befehlen, was auch immer). Zum Beispiel, wenn ichLC_ALL=en_US.UTF-8
, das sagt meine aktuelle shell verwenden "en_US.UTF-8" locale-Einstellungen. Auf der anderen Seite, wenn ichexport LC_ALL=en_US.UTF-8
würde sagen, die aktuellen shell - und alle Teilprozesse und Befehle, die es ausführt zu nutzen, dass die locale-Einstellung.Beachten Sie, dass eine shell-variable kann gekennzeichnet werden exportiert getrennt von der Definition, und sobald Sie einmal exportiert, es bleibt exportiert. Zum Beispiel
$PATH
ist (soweit ich weiß) immer exportiert, soPATH=/foo:/bar
hat die gleiche Wirkung wieexport PATH=/foo:/bar
(obwohl der letztere bevorzugt werden sollten, nur für den Fall $PATH irgendwie war das nicht bereits exportiert).Es ist auch möglich, exportieren Sie die variable zu einem bestimmten Befehl ohne definieren Sie in der aktuellen shell, indem Sie mit Hilfe der Zuordnung, die als Präfix für den Befehl. Zum Beispiel
LC_ALL=en_US.UTF-8 sort filename
wird Ihnen sagen, diesort
Befehl "en_US.UTF-8" locale-Einstellungen, aber nicht anwenden, die auf der aktuellen shell - (oder andere Befehle).alias
und Funktionen? sind Sie auch verfügbar zu Unterschalen/Kind-Prozesse, etc? wenn nicht, ist der export eines Mechanismus, der dazu zwingen könnte, die Art der Vererbung?fun() { echo hello; }; bash -c 'fun'
erhöhen wird einebash: fun: command not found
Fehler, aber nachexport -f fun
,bash -c 'fun'
sagen Hallo:)
.export -f
), aber das ist ein bash-only-Funktion-ich weiß nicht, alle anderen Muscheln können die Funktionen exportieren, oder, der wird verstehen, Funktionen exportiert, um Sie von der bash. Also, die Fähigkeit ist irgendwie da, aber es ist flippig und ein wenig verrückt. Auch, soweit ich weiß, keine shell unterstützt das exportieren von Aliasen.source
für das shell-Skript. Zum Beispiel habe ich einige Aliase, die ich mag zu verwenden, interaktiv. Ich habe auch ein script, das gilt für einen Befehl, um eine Reihe von lokalen GIT repositories. Ich möchte die Verwendung der Aliase mit dem Skript, das wiederholt Sie in all diesen Orten. Dazu definierte ich meineapply
aliassource do-command-everywhere.sh
. Funktioniert gut (solange Sie nichtexit
!) weil das Skript laufen Sie einfach in den aktuellen Prozess.