From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 6458 invoked by alias); 19 Jan 2015 21:44:46 -0000 Mailing-List: contact zsh-users-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Users List List-Post: List-Help: X-Seq: 19752 Received: (qmail 3688 invoked from network); 19 Jan 2015 21:44:44 -0000 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, HTML_MESSAGE,RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.2 Message-ID: <54BD7ABB.5070501@gmx.com> Date: Mon, 19 Jan 2015 16:44:27 -0500 From: Eric Cook User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.3.0 MIME-Version: 1.0 To: "zsh-users@zsh.org" Subject: Re: Equivalent of set -- *(DN) in sh References: <54BC1B8E.5080806@gmx.com> <1102431421682670@web6h.yandex.ru> In-Reply-To: <1102431421682670@web6h.yandex.ru> Content-Type: multipart/alternative; boundary="------------000908060807050401060500" X-Provags-ID: V03:K0:+hNy0e6wLgno5XNfNGxTaWEQ1aHRZEQhMr2rzYQofH++k2WwGFC zDzWp2aCzjaF20b8CLGaDkNGjGED+7x8zopfdDufi+6XdzXA6Pl4VqY7DlPLsGSGIB/xTU3 fIBJGM5JttRj6ZSUUUcDBvapa70TKGs+b7GSJ5Boe0iG5ujZjlKkPvwIKvhergLyO8hvg2C C1Y3G5SbRlOH1zlxE7ZnA== X-UI-Out-Filterresults: notjunk:1; --------------000908060807050401060500 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit 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. --------------000908060807050401060500--