Re: zsh: alias oder function mit Parameter?

From: Oliver Fromme <olli(at)secnetix.de>
Date: Tue, 17 Jun 2003 23:12:00 +0200 (CEST)

Manfred Lotz <manfred.lotz(at)web.de> wrote:
> On Tuesday 17 June 2003 21:21, Oliver Fromme wrote:
> > $ lsd_func() { ls -ld ${~@}(/); }
> > $ alias lsd="noglob lsd_func"
> > $ lsd t* b*
> > drwxr-xr-x 2 olli olli 2560 Apr 28 01:47 bin
> > drwxr-xr-x 3 olli olli 512 Mar 25 2002 tex
> > drwxr-xr-x 5 olli olli 512 May 29 00:40 tmp
> > drwxr-xr-x 6 olli olli 512 May 30 21:21 txt
> > $
> [...]
> Eine kleine Unschärfe habe ich aber gerade noch entdeckt. Gibt es in deinem
> Beispiel auch eine Datei bimbo, so wird bei lsd b* t* diese auch angezeigt;
> bei lsd t* b* funktioniert es. (/) müsste irgendwie jedem Parameter
> verabreicht werden.

Ahja. Ich vergaß eine Kleinigkeit.

Es hat bei mir durchaus funktioniert, und ich hatte in dem
Testverzeichnis mehrere Plain-files herumliegen, die mit b
und t anfangen. Allerdings habe ich in meiner ~/.zshenv

setopt rc_expand_param

drinstehen (neben diversen anderen setopts). Gib einfach
mal obigen setopt manuell ein, und teste dann das »lsd«
nochmal.

Dokumentiert ist das in zshoptions(1). Im Normalfall wird
der Inhalt von Arrays nämlich einfach stur ersetzt:

$ A=(a b c)
$ echo foo${A}bar
fooa b cbar

Und aus dem ${~@}(/) wird dann entsprechend: b* t*(/)
denn ${@} ist ja auch nix weiter als ein Array (die Tilde
sorgt dann nach der Expansion dafür, daß geglobbt wird).

Wenn man jetzt rc_expand_param setzt, wird der Token, in
dem sich das Array befindet, für jedes Array-Element kom-
plett dupliziert, ähnlich wie das bei Brace-Expansion
passiert:

$ A=(a b c)
$ echo foo${A}bar
fooabar foobbar foocbar

Und dann kommt in unserem Fall auch b*(/) t*(/) heraus.
Voila.

Wenn Du rc_expand_param nicht generell setzen möchtest,
kannst Du das natürlich auch lokal in der lsd_func() Funk-
tion machen. Dazu mußt Du in der Funktion allerdings eine
Subshell aufmachen (runde Klammern), weil eine Funktion
normalerweise im Kontext der aufrufenden Umgebung ausge-
führt wird, d.h. Änderungen an Variablen, Optionen usw.
wirken sich auch auf die aufrufende Shell aus.

Also nochmal zum Mitschreiben:

lsd_func() { ( setopt rc_expand_param; ls -ld ${~@}(/) ); }

Wenn Du das in Deine ~/.zshrc tust, sollte man das besser
in mehrere Zeilen schreiben, sonst wird das mit den Klam-
mern ein bißchen zu lispig. Und wenn wir eh schon setopt
verwenden, setzen wir auch gleich glob_subst, dann kann
nämlich die Tilde wieder weg (mitsamt geschweiften Klam-
mern), was das ganze vielleicht marginal lesbarer macht.
;-)

alias lsd="noglob lsd_func"
lsd_func()
{
    (
        setopt rc_expand_param glob_subst
        ls -ld $@(/)
    )
}

Soviel zur heutigen Lektion im zsh-Kursus. :)

Gruß
   Olli

-- 
Oliver Fromme, secnetix GmbH & Co KG, Oettingenstr. 2, 80538 München
Any opinions expressed in this message may be personal to the author
and may not necessarily reflect the opinions of secnetix in any way.
"Clear perl code is better than unclear awk code; but NOTHING
comes close to unclear perl code"  (taken from comp.lang.awk FAQ)
To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Tue 17 Jun 2003 - 23:12:05 CEST

search this site