Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Equivalent of set -- *(DN) in sh

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.


Messages sorted by: Reverse Date, Date, Thread, Author