Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: Equivalent of set -- *(DN) in sh
On 01/19/2015 10:51 AM, ZyX wrote:
> `..foo` is a valid name, but it is being excluded. You need to add `'.??*'` to the list of patterns.
Nice catch.
On 01/19/2015 11:02 AM, ZyX wrote:
>
> And you must replace `[^.]` with `[!.]`. mksh does not support `[^]` and treats this as `[\^.]`, but other shells I have (dash, ksh, zsh (in sh emulation mode), bash, busybox ash) are fine with both `[!.]` and `[^.]`.
and again.
On 01/19/2015 11:16 AM, ZyX wrote:
> emulate -L sh &>/dev/null
While this is just an test, it should be pointed out that `&>' is also
not defined nor does the same thing in all of the shells you tried. The
correct way being `>/dev/null 2>&1'.
On 01/19/2015 11:16 AM, ZyX wrote:
> Also note that if you need *full* equivalent of *(DN) you need to do something with ordering.
That depends on the user's locale, my LC_COLLATE was set to POSIX during
my tests and each shell sorted the files the same.
Setting LC_COLLATE to en_US.UTF-8 does give me the behavior you
mentioned. I don't think there is a correct way to account for that.
With:
#!/bin/sh
${ZSH_VERSION+false} : || emulate sh
match() {
test "$#" -gt 2 && return
test -e "$1" && return
return 1
}
set --
for pat in '..?*' '.[!.]*' '*'; do # I moved your added pattern to where
POSIX locale would sort them.
if match $pat; then
set -- "$@" $pat
fi
done
unset pat
test "$#" -gt 0 && printf '%s ' "$@"
% LC_COLLATE=POSIX
% printf '%s ' *(DN) > ../zshdn--set.log
% for sh in dash ksh mksh zsh bash bb; do $sh ../foo >../$sh--set.log; done
% md5sum ../*--set.log
99970f198535e5fe62aeec1a13ebc639 ../bash--set.log
99970f198535e5fe62aeec1a13ebc639 ../bb--set.log
99970f198535e5fe62aeec1a13ebc639 ../dash--set.log
99970f198535e5fe62aeec1a13ebc639 ../ksh--set.log
99970f198535e5fe62aeec1a13ebc639 ../mksh--set.log
99970f198535e5fe62aeec1a13ebc639 ../zsh--set.log
99970f198535e5fe62aeec1a13ebc639 ../zshdn--set.log
% LC_COLLATE=en_US.UTF-8
% printf '%s ' *(DN) > ../zshdn--set.log
% for sh in dash ksh mksh zsh bash bb; do $sh ../foo >../$sh--set.log; done
% md5sum ../*--set.log
28583c502cf605e105f794a37e1648da ../bash--set.log
28583c502cf605e105f794a37e1648da ../bb--set.log
99970f198535e5fe62aeec1a13ebc639 ../dash--set.log
28583c502cf605e105f794a37e1648da ../ksh--set.log
99970f198535e5fe62aeec1a13ebc639 ../mksh--set.log
4008c14ae7f0b2195c96d330d604ae50 ../zshdn--set.log
28583c502cf605e105f794a37e1648da ../zsh--set.log
Strangely, the two zsh tests i did aren't the same.
Messages sorted by:
Reverse Date,
Date,
Thread,
Author