zsh-users
 help / color / mirror / Atom feed
* (N) defaults to whole directory listing
@ 2021-01-29 15:24 Ray Andrews
  2021-01-29 15:33 ` Roman Perepelitsa
  0 siblings, 1 reply; 9+ messages in thread
From: Ray Andrews @ 2021-01-29 15:24 UTC (permalink / raw)
  To: Zsh Users

Is this really what we want?

    $ ls -1 no_such_file
    ls: cannot access 'no_such_file': No such file or directory

    $ ls -1 no_such_file 2> /dev/null

    $ ls -1 no_such_file(N)
    aaa
    aa-messagefunctions
    aliases
    aliases,1,remove _find_match
    aliases,2,STARTCOM
    ...

    ....  lists the whole directory.  It's not exactly what one might
    expect. I can see that if the argument 'disappears' entirely then
    'ls' thinks 'ls *' but shouldn't 'ls' be in a 'not found' condition
    rather than a 'list all' condition?




^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: (N) defaults to whole directory listing
  2021-01-29 15:24 (N) defaults to whole directory listing Ray Andrews
@ 2021-01-29 15:33 ` Roman Perepelitsa
  2021-01-29 17:01   ` Ray Andrews
  2021-01-29 19:04   ` Bart Schaefer
  0 siblings, 2 replies; 9+ messages in thread
From: Roman Perepelitsa @ 2021-01-29 15:33 UTC (permalink / raw)
  To: Ray Andrews; +Cc: Zsh Users

On Fri, Jan 29, 2021 at 4:24 PM Ray Andrews <rayandrews@eastlink.ca> wrote:
>
> Is this really what we want?
>
>     $ ls -1 no_such_file
>     ls: cannot access 'no_such_file': No such file or directory
>
>     $ ls -1 no_such_file 2> /dev/null
>
>     $ ls -1 no_such_file(N)
>     aaa
>     aa-messagefunctions
>     aliases
>     aliases,1,remove _find_match
>     aliases,2,STARTCOM
>     ...
>
>     ....  lists the whole directory.  It's not exactly what one might
>     expect. I can see that if the argument 'disappears' entirely then
>     'ls' thinks 'ls *' but shouldn't 'ls' be in a 'not found' condition
>     rather than a 'list all' condition?

`ls` without arguments lists files in the current directory. This is
mandated by POSIX and what everyone expects.

`no_such_file(N)` expands to nothing if there is no file named
`no_such_file` in the current directory. This is in line with the zsh
documentation and what everyone expects.

If your examples aren't artificial but really show what you are trying
to do, you can do it like this:

  print -rC1 -- no_such_file(N)

This will print `no_such_file` if such file exists and will do nothing
otherwise.

If you really need that `ls` call (perhaps because you are passing
some flags to it), you can do this:

  ( ls -1 no_such_file(#q) ) 2>/dev/null

This does the same as above but about 1000 times slower and returns an
error if the file doesn't exist.

You can also use an explicit condition:

  if [[ -e no_such_file ]]; then
    ls -1 no_such_file
  fi

Roman.


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: (N) defaults to whole directory listing
  2021-01-29 15:33 ` Roman Perepelitsa
@ 2021-01-29 17:01   ` Ray Andrews
  2021-01-29 17:52     ` Lawrence Velázquez
  2021-01-29 18:47     ` Bart Schaefer
  2021-01-29 19:04   ` Bart Schaefer
  1 sibling, 2 replies; 9+ messages in thread
From: Ray Andrews @ 2021-01-29 17:01 UTC (permalink / raw)
  To: zsh-users

On 2021-01-29 7:33 a.m., Roman Perepelitsa wrote:
>
> `ls` without arguments lists files in the current directory. This is
> mandated by POSIX and what everyone expects.
Of course.
>
> `no_such_file(N)` expands to nothing if there is no file named
> `no_such_file` in the current directory. This is in line with the zsh
> documentation and what everyone expects.
That's about what I I expected to hear.  zsh can't be expected to feed 
'ls' with something that duplicates a non-existent file, it can only 
remove the non-existent file thus leaving no argument thus ls must be 
'ls *'.  I had thought there might be some hidden mechanism by which ls 
might be informed that the given argument fails but I can quite 
understand that no such thing exists -- zsh just removes the 
non-existent argument and that's all she can do and ls is on it's own.  
Thanks Roman.


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: (N) defaults to whole directory listing
  2021-01-29 17:01   ` Ray Andrews
@ 2021-01-29 17:52     ` Lawrence Velázquez
  2021-01-29 19:52       ` Ray Andrews
  2021-01-29 18:47     ` Bart Schaefer
  1 sibling, 1 reply; 9+ messages in thread
From: Lawrence Velázquez @ 2021-01-29 17:52 UTC (permalink / raw)
  To: Ray Andrews; +Cc: zsh-users

> On Jan 29, 2021, at 12:01 PM, Ray Andrews <rayandrews@eastlink.ca> wrote:
> 
>> On 2021-01-29 7:33 a.m., Roman Perepelitsa wrote:
>> 
>> `no_such_file(N)` expands to nothing if there is no file named
>> `no_such_file` in the current directory. This is in line with the
>> zsh documentation and what everyone expects.
> 
> That's about what I I expected to hear.  zsh can't be expected to
> feed 'ls' with something that duplicates a non-existent file, it
> can only remove the non-existent file thus leaving no argument

This only happens because you're using '(N)', which you could easily
drop if it's not desirable. It often is, though, so you need to be
aware of how the rest of your code works if a glob expands to
nothing.

> thus ls must be 'ls *'.

This is false.

	% mkdir -p foo/bar{1,2} && touch foo/bar{1,2}/baz && cd foo
	% ls
	bar1	bar2
	% ls *
	bar1:
	baz

	bar2:
	baz

You might be better off avoiding this sort of thing by testing your
globs with `print` (or something similar), as Roman demonstrated.

vq


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: (N) defaults to whole directory listing
  2021-01-29 17:01   ` Ray Andrews
  2021-01-29 17:52     ` Lawrence Velázquez
@ 2021-01-29 18:47     ` Bart Schaefer
  1 sibling, 0 replies; 9+ messages in thread
From: Bart Schaefer @ 2021-01-29 18:47 UTC (permalink / raw)
  To: Ray Andrews; +Cc: Zsh Users

On Fri, Jan 29, 2021 at 9:01 AM Ray Andrews <rayandrews@eastlink.ca> wrote:
>
> That's about what I expected to hear.  zsh can't be expected to feed
> 'ls' with something that duplicates a non-existent file, it can only
> remove the non-existent file thus leaving no argument

Your problem is that (N) means NULL_GLOB, but you want it to mean CSH_NULL_GLOB.

Have you considered using "setopt CSH_NULL_GLOB" and then not using (N) ...?


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: (N) defaults to whole directory listing
  2021-01-29 15:33 ` Roman Perepelitsa
  2021-01-29 17:01   ` Ray Andrews
@ 2021-01-29 19:04   ` Bart Schaefer
  2021-01-30 10:50     ` Roman Perepelitsa
  1 sibling, 1 reply; 9+ messages in thread
From: Bart Schaefer @ 2021-01-29 19:04 UTC (permalink / raw)
  To: Roman Perepelitsa; +Cc: Ray Andrews, Zsh Users

On Fri, Jan 29, 2021 at 7:33 AM Roman Perepelitsa
<roman.perepelitsa@gmail.com> wrote:
>
>   print -rC1 -- no_such_file(N)
>
> This will print `no_such_file` if such file exists and will do nothing
> otherwise.

Not precisely nothing ... it will print a newline.

>   ( ls -1 no_such_file(#q) ) 2>/dev/null

That can be done without a subshell:

{ ls no_such_file(#q) } 2>&-

However, that needs one of extendedglob or nobareglobqual, plus I
think he actually wants the error message.

To get the effect of (#q) without extendedglob, use (+true) ... but I
don't believe that's very useful in this specific example.


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: (N) defaults to whole directory listing
  2021-01-29 17:52     ` Lawrence Velázquez
@ 2021-01-29 19:52       ` Ray Andrews
  0 siblings, 0 replies; 9+ messages in thread
From: Ray Andrews @ 2021-01-29 19:52 UTC (permalink / raw)
  To: zsh-users

On 2021-01-29 9:52 a.m., Lawrence Velázquez wrote:
> mkdir -p foo/bar{1,2} && touch foo/bar{1,2}/baz && cd foo
Ah, right, I need 'ls -d *' to mirror plain 'ls'.  Anyway the point 
remains that ls has no way of knowing that zsh has removed the argument 
thus there is no failure to report.

     Have you considered using "setopt CSH_NULL_GLOB" and then not using (N) ...?

To avoid surprises it seems the ' 2> dev/null ' is going to satisfy.  In unnecessary detail what was happening was that in my wrapper I'd get this:

     1 /aWorking/Zsh/Source/Wk 3 $ l zzz

     LISTING of "zzz": all file types, INsensitive. Sorting upside down by: Mod. Time:

     drwxr-xr-x 10 20480 [2021-01-29--07:08] ./

     Items found: 1
     Total bytes in this directory: 2.8M
     Total including subdirs: 12M	

... there was always that annoying false find of 'dot'.  But  ' >2 /dev/null ' fixes it.  BTW the 'Items found' comes from using 'wc' but that too reports one item even if the output is zero which seems strange but it's fixable:

     1 /aWorking/Zsh/Source/Wk 3 $ . l; l zzz

     LISTING of "zzz": all file types, INsensitive. Sorting upside down by: Mod. Time:

     Nothing found

... so all's well.





^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: (N) defaults to whole directory listing
  2021-01-29 19:04   ` Bart Schaefer
@ 2021-01-30 10:50     ` Roman Perepelitsa
  2021-01-30 15:00       ` Beverly Pope
  0 siblings, 1 reply; 9+ messages in thread
From: Roman Perepelitsa @ 2021-01-30 10:50 UTC (permalink / raw)
  To: Bart Schaefer; +Cc: Ray Andrews, Zsh Users

On Fri, Jan 29, 2021 at 8:04 PM Bart Schaefer <schaefer@brasslantern.com> wrote:
>
> On Fri, Jan 29, 2021 at 7:33 AM Roman Perepelitsa
> <roman.perepelitsa@gmail.com> wrote:
> >
> >   print -rC1 -- no_such_file(N)
> >
> > This will print `no_such_file` if such file exists and will do nothing
> > otherwise.
>
> Not precisely nothing ... it will print a newline.

If the file doesn't exist, the command is equivalent to this:

  print -rC1 --

This command doesn't print anything.

Roman.


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: (N) defaults to whole directory listing
  2021-01-30 10:50     ` Roman Perepelitsa
@ 2021-01-30 15:00       ` Beverly Pope
  0 siblings, 0 replies; 9+ messages in thread
From: Beverly Pope @ 2021-01-30 15:00 UTC (permalink / raw)
  To: Roman Perepelitsa; +Cc: Bart Schaefer, Ray Andrews, Zsh Users

[-- Attachment #1: Type: text/plain, Size: 787 bytes --]


> On Jan 30, 2021, at 4:50 AM, Roman Perepelitsa <roman.perepelitsa@gmail.com> wrote:
> 
> On Fri, Jan 29, 2021 at 8:04 PM Bart Schaefer <schaefer@brasslantern.com <mailto:schaefer@brasslantern.com>> wrote:
>> 
>> On Fri, Jan 29, 2021 at 7:33 AM Roman Perepelitsa
>> <roman.perepelitsa@gmail.com <mailto:roman.perepelitsa@gmail.com>> wrote:
>>> 
>>>  print -rC1 -- no_such_file(N)
>>> 
>>> This will print `no_such_file` if such file exists and will do nothing
>>> otherwise.
>> 
>> Not precisely nothing ... it will print a newline.
> 
> If the file doesn't exist, the command is equivalent to this:
> 
>  print -rC1 --
> 
> This command doesn't print anything.


% print -rC1 -- no_such_file(N)

zsh 5.8 (Ubuntu): prints nothing
zsh 5.7.1 (Mac): prints return

[-- Attachment #2: Type: text/html, Size: 6118 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2021-01-30 15:01 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-01-29 15:24 (N) defaults to whole directory listing Ray Andrews
2021-01-29 15:33 ` Roman Perepelitsa
2021-01-29 17:01   ` Ray Andrews
2021-01-29 17:52     ` Lawrence Velázquez
2021-01-29 19:52       ` Ray Andrews
2021-01-29 18:47     ` Bart Schaefer
2021-01-29 19:04   ` Bart Schaefer
2021-01-30 10:50     ` Roman Perepelitsa
2021-01-30 15:00       ` Beverly Pope

zsh-users

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://inbox.vuxu.org/zsh-users

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V1 zsh-users zsh-users/ http://inbox.vuxu.org/zsh-users \
		zsh-users@zsh.org
	public-inbox-index zsh-users

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://inbox.vuxu.org/vuxu.archive.zsh.users


code repositories for the project(s) associated with this inbox:

	https://git.vuxu.org/mirror/zsh/

AGPL code for this site: git clone https://public-inbox.org/public-inbox.git