Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: [BUG] zf_ln complains about the wrong argument



Peter Stephenson wrote on Mon, Aug 23, 2021 at 09:33:21 +0100:
> 
> > On 22 August 2021 at 22:05 Daniel Shahaf <d.s@xxxxxxxxxxxxxxxxxx> wrote:
> > Peter Stephenson wrote on Sun, 22 Aug 2021 20:24 +00:00:
> > > Also seems a good idea to turn a null string into a couple of quotes.  I
> > > thought of modifying the error message handler but this has too many
> > > knock on effects.
> > 
> > What "knock on effects"?  Extending zwarning() with a %q format code
> > that takes a «char *» and outputs it quoted seems like a good idea and
> > shouldn't break anything.  Will handle filenames with spaces, too.
> 
> This is certainly all stuff that's accumulated rather than been planned
> over the years, but having a harder look I think it's mostly not too bad
> the way it is.  I think the basics are currently as follows.
> 
> %s as implemented in errors and warnings is already not a straight 
> printf %s: it uses nicezputs() to emphasise visibility rather than quoting,
> i.e. it's there to make it easy to see what the error is about, rather than
> easy to copy back into the shell.  Given the error is about something that
> would usually be either in a script or on the command line, this doesn't
> seem a bad way of doing it, on reflection.
> 

Well, sure, %s doesn't have to use the an escaping algorithm that's
inputtable back into the shell, but it'd still be nice if the escaping
were clear and unambiguous.  As it stands, printing «%s» doesn't escape
or quote empty strings and spaces.

> As far as quoting is concerned, the state of the art is to use `%s' (i.e.
> with those literal quotes) if it seems necessary to draw attention to the
> argument, i.e. it could get lost otherwise.  There are a  lot of cases
> where we don't do this, however, but they can easily be changed.  The
> combination of this and nicezputs() means you can always see what's
> there, unless there are very subtle cases I've missed.

If the argument to %s contains literal single quotes then this is
ambiguous.

> So I think the consistent way of handling a case like this is to turn
> %s into `%s'.  That both makes it visible what's going on and makes
> the output consistent with similar cases elsewhere.
> 
> Does that seem reasonable?

+1

> I can't think of a strong argument for a more widespread change given
> it's sort of working and even sort of potentially consistent.

Well, if there were a %q that did unambiguous escaping/quoting, it'd be
harder to accidentally write zwarning("foo: %s: bar") in new code,
forgetting to quote.  And of course, filenames with single quotes would
be output more unambiguously :)

Cheers,

Daniel




Messages sorted by: Reverse Date, Date, Thread, Author