기본적으로 모든 쉘 :
printf '{ PS4=\${$(($#-$x))}; } 2>&3; 2>&1\n%.0s' |
x=LINENO+1 sh -sx "$@" 3>/dev/null
그리고 서브 쉘을 사용할 필요 가 없습니다 . 예를 들면 다음과 같습니다.
set -x a b c
{ last= PS4=\${last:=\${$#}}; set +x; } 2>/dev/null
echo "$last"
...인쇄물...
c
그리고 여기 alias
에 인수를 앞뒤로 인쇄 할 쉘 을 설정할 수있는 쉘 함수가 있습니다 :
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
인수에 대한 리터럴 값을 저장하려고 시도하지 않고 다음과 같은 문자열을 args
alias
:
:;printf "%.$(($??${#*}:0))s%.$((!$??${#*}:0))s\n" \
"$1" "${3}" "${2}" "${2}" "${3}" "${1}"
... 따라서 앞뒤로 매개 변수에 대한 참조 만 저장합니다. 인수로 주어진 수만큼 카운트를 저장합니다. 그리고 위와 같이 alias
생성되었습니다 :
tofro 3
printf
의 동작은 이전 명령의 반환 값을 기반으로 영향을받습니다. 항상 :
null 명령이므로 일반적으로 true입니다. printf
인쇄 할 때마다 인수의 절반을 건너 뜁니다. 기본적으로 인수는 가장 작은 숫자에서 가장 큰 숫자로 인쇄됩니다. 그러나 당신이 방금 할 경우 :
! args
... 반대로 인쇄합니다.
별명은 리터럴 값을 저장하지 않으므로 실제 인수는 변경 될 수 있지만 정적 값은 그대로 유지되지만 여전히 많은 수를 참조합니다. 예를 들면 다음과 같습니다.
set one two three
tofro 3
args; ! args
shift; args; ! args
... 인쇄 ...
one
two
three
three
two
one
two
three
three
two
그러나 별칭 재설정은 다음과 같이 수행 할 수 있습니다.
tofro 2
args; ! args
... 그래서 인쇄합니다 ...
two
three
three
two
arg
그들이 올바르게 주문되고 반대로되지 않기 때문에 사용할 수 없습니다 . 의 사용으로expr
표준 만 사용하도록 제한되어 있습니다.