Mit grundsätzlich jeder Shell:
printf '{ PS4=\${$(($#-$x))}; } 2>&3; 2>&1\n%.0s' |
x=LINENO+1 sh -sx "$@" 3>/dev/null
Und Sie nicht brauchen , verwenden Subshells. Beispielsweise:
set -x a b c
{ last= PS4=\${last:=\${$#}}; set +x; } 2>/dev/null
echo "$last"
... druckt ...
c
Und hier ist eine Shell-Funktion, mit der Sie eine Shell festlegen können alias, die die Argumente vorwärts oder rückwärts ausgibt:
tofro() case $1 in (*[!0-9]*|'') ! :;;(*) set "$1"
until [ "$1" -eq "$(($#-1))" ] &&
shift && alias args=":; printf \
\"%.\$((\$??\${#*}:0))s%.\$((!\$??\${#*}:0))s\n\" $* "
do [ "$#" -gt 1 ] &&
set "$@ \"\${$#}\" " '"${'"$((1+$1-$#))"'}"' ||
set "$1" '"$1" "${'"$1"'}"'
done; esac
Es wird nicht versucht, die Literalwerte für Argumente zu speichern, sondern es wird eine Zeichenfolge wie die folgende in das args aliasfolgende Feld eingefügt :
:;printf "%.$(($??${#*}:0))s%.$((!$??${#*}:0))s\n" \
"$1" "${3}" "${2}" "${2}" "${3}" "${1}"
... und speichert so nur Verweise auf die Parameter vor und zurück. Es wird bis zu einer Anzahl gespeichert, die als Argument angegeben wird. Und so wurde das oben aliasGenannte wie folgt generiert:
tofro 3
printfDas Verhalten von wird basierend auf dem Rückgabewert des vorherigen Befehls beeinflusst - der immer :der Null-Befehl ist und daher normalerweise wahr ist. printfBei jedem Ausdruck wird die Hälfte der Argumente übersprungen. Standardmäßig werden die Argumente von klein nach groß gedruckt. Wenn Sie jedoch nur Folgendes tun:
! args
... es druckt sie umgekehrt.
Da der Alias keine Literalwerte speichert, bleibt sein Wert statisch, während sich die tatsächlichen Argumente ändern, er verweist jedoch weiterhin auf so viele wie möglich. Beispielsweise:
set one two three
tofro 3
args; ! args
shift; args; ! args
... was druckt ...
one
two
three
three
two
one
two
three
three
two
Das Zurücksetzen des Alias kann folgendermaßen erfolgen:
tofro 2
args; ! args
... und so druckt es ...
two
three
three
two
argda sie korrekt und nicht umgekehrt bestellt sind. Für die Verwendung vonexprbin ich nur auf die Verwendung des Standards beschränkt.