hello,
If a function calls an alias, if the alias changes, the function must be
resourced, yes? That makes nothing but sense sincethe alias is what it is
at sourcing. An executed script uses the alias in 'real time'. But, is
there a way to make a function also use the real time value of an alias?
Sure, I was just wondering if it was possible at all with an alias.
my advice is: see aliases as macro: don't use it as long as you can
achieve things with functions. one of the reasons is aliases can be used
after a variable expansion and so you can get some surprising behaviors.
rip () {
print $1 wrote
"$@"
print then $1 died
}
alias stephen='print a brief history of time'
rip stephen hawkings
then your universe colapse
stephen wrote
rip:2: command not found: stephen
then stephen died
but
rip () {
print $1 wrote
"$@"
print then $1 died
}
stephen () print a brief history of time
rip stephen hawkings
gives you a good reading advice
stephen wrote
a brief history of time
then stephen died
so when are aliases useful? well ... basically when you need something
like a preprocessor. for example if you have a set of functions where
the first arguments are always the same, you can write an alias for it:
alias user_='local ns=${1?namespace of the user expected} \
id=${2?the id of the user expected}'
showid () { user_; print user id is $id }
showns () { user_; print user ns is $ns }
showid
warns you
showid: 1: namespace of the user expected
another example from uze.zsh (https://github.com/zsh-uze)
warn_ () { local r=$?; print -u2 "$*"; return $r }
die_ () { local r=$?; print -u2 "$*"; exit $r }
alias warn='warn_ at $0 line $LINENO, warning:'
alias ...='{warn unimplemented; return 255}'
alias die='die_ died at $0 line $LINENO:'
now i can write
allowed () false
do_stuff () {
if {allowed} {
print i do stuff
} else {
# what to do then ?
...
}
}
do_stuff
so i have this message:
at do_stuff line 5, warning: unimplemented
hth,
marc
you ask, there might be some option or something whereby a function is
instructed to grab an alias at runtime sorta the way the value of a variable
is grabbed at runtime.
you can use both functions and arrays
show () {
print "hello, i'm a particle and i'm"
position
}
position () print here and there
show
position () print elsewhere
show
gives
hello, i'm a particle and i'm
here and there
hello, i'm a particle and i'm
elsewhere
also
show () print -l "hello, i'm a particle and i'm" $position
position=( here and there )
show
position=( elsewhere )
show
gives
hello, i'm a particle and i'm
here
and
there
hello, i'm a particle and i'm
elsewhere
don't forget that in crontrary of other shells, zsh takes arrays and
word spliting seriously so you can store a whole command into an array.
this is lovely when you build one step by step
academic () true
faster () true
dryrun () true
dryrun && compiles=( print cc )
|| compiles=( cc )
academic && compiles+=( -Wall -std=c99 )
faster && compiles+=( -O2 )
compiles+=( $src $dest )
$compiles
hth
marc