Temel olarak herhangi bir kabukla:
printf '{ PS4=\${$(($#-$x))}; } 2>&3; 2>&1\n%.0s' |
x=LINENO+1 sh -sx "$@" 3>/dev/null
Ve alt kabuk kullanmanıza gerek yok . Örneğin:
set -x a b c
{ last= PS4=\${last:=\${$#}}; set +x; } 2>/dev/null
echo "$last"
... baskılar ...
c
Ve işte alias
sizin için argümanları ileri veya geri yazdıracak bir kabuk ayarlayabilen bir kabuk işlevi :
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
Herhangi bir argüman için değişmez değerleri depolamaya çalışmaz, bunun yerine şuna böyle bir dize koyar args
alias
:
:;printf "%.$(($??${#*}:0))s%.$((!$??${#*}:0))s\n" \
"$1" "${3}" "${2}" "${2}" "${3}" "${1}"
... ve böylece sadece ileri ve geri parametrelerdeki referansları saklar. Bağımsız değişken olarak verildiği şekilde bir sayıyı depolar. Ve böylece yukarıdaki alias
gibi üretildi:
tofro 3
printf
'nin davranışı, önceki komutun dönüş değerine göre etkilenir - bu her zaman :
null komuttur ve bu nedenle genellikle doğrudur. printf
her yazdırdığında argümanlarının yarısını atlar - varsayılan olarak, en küçük numaralıdan en büyüğe yazdırılan bağımsız değişkenleri alır. Ancak, yalnızca şunları yaparsanız:
! args
... tam tersini yazdırıyor.
Takma ad hiçbir değişmez değeri depolamadığından, gerçek bağımsız değişkenler değişebilirken değeri sabit kalır, ancak yine de olabildiğince çok başvurur. Örneğin:
set one two three
tofro 3
args; ! args
shift; args; ! args
... hangi baskı ...
one
two
three
three
two
one
two
three
three
two
Ancak takma adı sıfırlamak şu şekilde yapılabilir:
tofro 2
args; ! args
... ve böylece yazdırılıyor ...
two
three
three
two
arg
Onlar doğru sipariş ve ters değil gibi kullanamazsınız . Kullanımıyla ilgili olarakexpr
, sadece standardı kullanmakla sınırlıyım.