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