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
alias
folgende 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 alias
Genannte wie folgt generiert:
tofro 3
printf
Das Verhalten von wird basierend auf dem Rückgabewert des vorherigen Befehls beeinflusst - der immer :
der Null-Befehl ist und daher normalerweise wahr ist. printf
Bei 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
arg
da sie korrekt und nicht umgekehrt bestellt sind. Für die Verwendung vonexpr
bin ich nur auf die Verwendung des Standards beschränkt.