Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: Equivalent of set -- *(DN) in sh
- X-seq: zsh-users 19765
- From: Stephane Chazelas <stephane.chazelas@xxxxxxxxx>
- To: Nikolai Weibull <now@xxxxxxx>
- Subject: Re: Equivalent of set -- *(DN) in sh
- Date: Thu, 22 Jan 2015 15:21:40 +0000
- Cc: Eric Cook <llua@xxxxxxx>, "zsh-users@xxxxxxx" <zsh-users@xxxxxxx>
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=date:from:to:cc:subject:message-id:mail-followup-to:references :mime-version:content-type:content-disposition :content-transfer-encoding:in-reply-to:user-agent; bh=jb2sFjdQcYjptCHdakVKliAZ2xvXi6VurDzO5/epaz4=; b=tedyB0XQQJwrZhRVGSHdE3oXC7ZKyPHy8VdIgD0sOhz7bzidDI3gmHO1WllPURqJBl x/6F3LgdYEJfgPl+apvhNKMM+70RT5tJ1DE+yl2SuJtx0FTLJF1F++52uHyJVDXcphfY xOOhAJpCnGn7rnW1V5pqTcXBx+zPulgHMIsF9YuYQROQ3tyKJ6xABke52vLUk1SQw6/U 8T5FafoNXvYlggZbAezELKsd887lQ4JA8SJwLpDYjf2Hhs4yBBs9/MIfqidw66/3Ld8e jtu+7J77hQTeSrmC/00cKewRyv7wcH3vNcn/eO3Etgt+mop7395lB7/bXAtcoM3dAFac wsQQ==
- In-reply-to: <CADdV=MsvuSAQMJVsr17Y7g2Nfjy95CQ007opQqv-7=RHjgjaKw__35342.9068615243$1421913204$gmane$org@mail.gmail.com>
- List-help: <mailto:zsh-users-help@zsh.org>
- List-id: Zsh Users List <zsh-users.zsh.org>
- List-post: <mailto:zsh-users@zsh.org>
- Mail-followup-to: Nikolai Weibull <now@xxxxxxx>, Eric Cook <llua@xxxxxxx>, "zsh-users@xxxxxxx" <zsh-users@xxxxxxx>
- Mailing-list: contact zsh-users-help@xxxxxxx; run by ezmlm
- References: <CADdV=MvMtwYczr82GeYkmVwTFCKgFcbgYS71XdnHZN_JqFqzTg@mail.gmail.com> <54BC1B8E.5080806@gmx.com> <1102431421682670@web6h.yandex.ru> <54BD7ABB.5070501__36205.2317861982$1421704010$gmane$org@gmx.com> <20150119230556.GA4093@chaz.gmail.com> <CADdV=MsvuSAQMJVsr17Y7g2Nfjy95CQ007opQqv-7=RHjgjaKw__35342.9068615243$1421913204$gmane$org@mail.gmail.com>
2015-01-22 08:44:40 +0100, Nikolai Weibull:
[...]
> set x *; shift
> test $# -eq 1 && test "x$1" = x\* && ! test -e \* && shift
> n=$#
> set x .[!.]* ${1+"$@"}; shift
> test $# -eq `expr $n + 1` && test "x$1" = 'x.[!.]?*' && ! test -e
> '.[!.]?*' && shift
> n=$#
> set x ..?* ${1+"$@"}; shift
> test $# -eq `expr $n + 1` && test ="x$1" = 'x..?*' && ! test -e '..?*' && shift
>
> This tries to avoid using test -e (or whatever version of testing for
> a files existence you’d like to use)
Well, it doesn't try very hard does it ;-) ? Remember you need
test -e || test -L (or test -h on some old systems).
> but also avoids using patterns
> just to test for failures to avoid unnecessary directory traversals.
The directory content will be in cache after the first `set x
*`. Forking and exeuting some exprs is probably going to be
worse in most cases.
> It also avoids messing with IFS, but perhaps that’s necessary?
Well, yes "$@" in the Bourne shell relies on it containing space
and you're leaving a number of variables and command
substitutions unquoted.
Note that "case" has far fewer problems than "test".
>
> The ${1+"$@"} is to avoid an old Zsh bug, right?
No, that's the other way round. ${1+"$@"} is to work around
problems with the Bourne shell (at least those where that has
not been fixed (where "$@" expands to one empty argument when $#
is 0)). zsh is the one that had problems with
${1+"$@"} (not "$@"), not really a bug, but down to how
parameter expansion nested.
Which is why you see things like:
test -z "$ZSH_VERSION" || alias -g '${1+"$@"}="$@"'
> It also avoids set --, as that’s apparently not portable either.
According to http://www.in-ulm.de/~mascheck/bourne/, -- was
added to the Bourne shell at the same time as [!...], so that
would suggest that if you want to account for those very old
systems, you can't use [!...] either. Note that old Bourne
shells didn't support characters with the 8th bit set either.
--
Stephane
Messages sorted by:
Reverse Date,
Date,
Thread,
Author