From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.2 Received: (qmail 28997 invoked from network); 12 Apr 2020 07:10:28 -0000 Received-SPF: pass (primenet.com.au: domain of zsh.org designates 203.24.36.2 as permitted sender) receiver=inbox.vuxu.org; client-ip=203.24.36.2 envelope-from= Received: from ns1.primenet.com.au (HELO primenet.com.au) (203.24.36.2) by inbox.vuxu.org with UTF8ESMTPZ; 12 Apr 2020 07:10:28 -0000 Received: (qmail 3225 invoked by alias); 12 Apr 2020 07:10:15 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: List-Unsubscribe: X-Seq: 45680 Received: (qmail 5763 invoked by uid 1010); 12 Apr 2020 07:10:15 -0000 X-Qmail-Scanner-Diagnostics: from relay7-d.mail.gandi.net by f.primenet.com.au (envelope-from , uid 7791) with qmail-scanner-2.11 (clamdscan: 0.102.2/25772. spamassassin: 3.4.4. Clear:RC:0(217.70.183.200):SA:0(-2.6/5.0):. Processed in 4.451307 secs); 12 Apr 2020 07:10:15 -0000 X-Envelope-From: stephane@chazelas.org X-Qmail-Scanner-Mime-Attachments: | X-Qmail-Scanner-Zip-Files: | Received-SPF: pass (ns1.primenet.com.au: SPF record at _nblcust.gandi.net designates 217.70.183.200 as permitted sender) X-Originating-IP: 94.3.152.49 Date: Sun, 12 Apr 2020 08:09:30 +0100 From: Stephane Chazelas To: zsh-workers@zsh.org Subject: Re: glob qualifier '-' doesn't work correctly on dangling symlinks Message-ID: <20200412070930.etfzj6j2qvd5em7b@chazelas.org> Mail-Followup-To: zsh-workers@zsh.org References: <20200411151511.GA1708902@zira.vinc17.org> <20200411173450.56nnznxtmil5oge3@chazelas.org> <20200411191711.GA1722320@zira.vinc17.org> <20200411203714.wupg6wmd7b7xch2w@chazelas.org> <20200411234817.GA1737986@zira.vinc17.org> <20200412012155.7954a35f@tarpaulin.shahaf.local2> <20200412021722.GA1748686@zira.vinc17.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20200412021722.GA1748686@zira.vinc17.org> User-Agent: NeoMutt/20180716 2020-04-12 04:17:22 +0200, Vincent Lefevre: [...] > > What would be the glob qualifier syntax for broken symlinks? > > There would need something for that. But even currently, there > are things one cannot do with glob qualifiers, such as one does > not have a way to know the reason why a symlink is broken, which > can be important when one is interested in broken symlinks. > > zira% ln -s /does-not-exist s1 > zira% ln -s /root/foo s2 > zira% ls -L s* > ls: cannot access 's1': No such file or directory > ls: cannot access 's2': Permission denied > > But with glob qualifiers, there does not seem to be a way to > distinguish these two cases. [...] There's: $ zmodload zsh/system $ ls -ld -- *(e[ERRNO=0]-e['[[ $errnos[ERRNO] = EACCES ]]']) lrwxrwxrwx 1 chazelas chazelas 9 Apr 12 07:34 s2 -> /root/foo $ ls -ld -- *(e[ERRNO=0]-e['[[ $errnos[ERRNO] = ENOENT ]]']) lrwxrwxrwx 1 chazelas chazelas 15 Apr 12 07:34 s1 -> /does-not-exist (the ERRNO=0 may not be necessary). Note: $ find -L . -perm -o=w ./s1 find: ‘./s2’: Permission denied But again, *(-@) for broken symlinks is documented and widely used, we can't break that. So if we change "-" to exclude broken symlinks, we'd need to special case -@. What's the scope of what should be special cased? *(-@e['((count++))']) should probably still work as well for instance. How about: *(-e['((n++))']@['((brokenlinks++))'])? And *(-@m-1) (broken links created in the last 24 hours, though I'd expect one to write *(m-1-@) instead here) Note that for "find -L", zsh's current behaviour is required by POSIX (at least for links whose target can be determined not to exist): -L Cause the file information and file type evaluated for each symbolic link encountered as a path operand on the command line or encountered during the traversal of a file hierarchy to be those of the file referenced by the link, and not the link itself. If the ^^^^^^ referenced file does not exist, the file information ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ and type shall be for the link itself. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ I find some variation in behaviour though: $ ln -s /etc/passwd/foo s3 $ gfind . -follow -perm -o=w gfind: ‘./s3’: Not a directory ./s3 ./s1 gfind: ‘./s2’: Permission denied $ busybox find . -follow -perm -o=w find: ./s3: Not a directory ./s1 find: ./s2: Permission denied $ find_su3 . -follow -perm -o=w find_su3: cannot follow symbolic link ./s3: Not a directory find_su3: cannot follow symbolic link ./s1: No such file or directory find_su3: cannot follow symbolic link ./s2: Permission denied (the latter from the heirloom toolchest being not POSIX compliant) In any case, in */*(W), or ***/*(W) or **/*(W), the cases where directories are not readable or searchable, or symlink targets not accessible are always silently ignored (as opposed to the find equivalents). -- Stephane