So wie ich das bisher kapiert habe, macht ein Alias, technisch gesehen, nichts anderes, als eine Zeichenkette durch eine andere Zeichenkette zu ersetzen.
Das heißt, sie wird von der Bash nicht vor-evaluiert und befindet sich entsprechend im gleichen Scope wie alle anderen Zeichen innerhalb einer Kommandozeile.
Wenn man auf einer Kommandozeile mehrere Kommandos unterbringt (, die z.B. durch
; ,
&& oder
|| voneinander getrennt sind), dann werden diese Kommandos von der Bash so abgearbeitet, dass zuerst das am weitesten links stehende Kommando evaluiert wird, danach das Kommando eine Position weiter rechts usw. ...
Dadurch ist es also unmöglich, dass das Kommando ganz links schon wissen kann, was im Kommando ganz rechts steht, denn die Bash kann keine Zeitreisen.
Anders ist es bei Funktionen. Diese befinden sich, im Gegensatz zum Alias, nicht im gleichen Scope wie die übrigen Zeichen einer Kommandozeile. Nur durch diese Eigenschaft sind sie in der Lage, mit nachgestellten Argumenten umzugehen. Eine Funktion kann das, was eine tote Zeichenkette nicht kann, nämlich Argumente verarbeiten, die ihr von außerhalb des Scopes mitgegeben werden.
Funktionen können also Aikido, Aliase können das nicht:
kq() { setsid $@ 2>/dev/null; }
Soweit so richtig?