Re: [PATCH v2] test_cmp: diagnose incorrect arguments
- From
Taylor Blau <me@ttaylorr.com>
- Date
- Aug 11, 2020, 21:03 UTC
- Message-ID
- <20200811210337.GA34786@syl.lan>
- In-Reply-To
- <CAPig+cSroWZEoOL78COmPS4rkvKLE-yCiqh6Part+5gUgVon+A@mail.gmail.com>
On Tue, Aug 11, 2020 at 03:25:03PM -0400, Eric Sunshine wrote:
Show 9 quoted lines
> On Tue, Aug 11, 2020 at 2:33 PM Taylor Blau <me@ttaylorr.com> wrote: > > On Sun, Aug 09, 2020 at 01:42:09PM -0400, Eric Sunshine wrote: > > > + test "x$2" = x- || test -e "$2" || BUG "test_cmp '$2' missing" > > > > Not related to your patch, but I've seen this style of "x$1" in a few > > places in test-lib-functions.sh. Why can't this be written as 'test "$1" > > = -'? > > Short answer: To prevent 'test' from thinking that the argument is a switch.
Makes sense. Now I feel silly for asking :).
Show 31 quoted lines
> Longer answer: > > 'test' can accept both switches (i.e. "-e") and non-switch arguments. > Keep in mind, too, that all the quoting is stripped by the shell > _before_ 'test' ever sees its arguments. Let's say that the caller has > a filename whose name actually is "-e" and passes that in as $1. So, > what does 'test' see? > > test -e = - > > Rather than comparing literal string "-e" to literal string "-", it's > instead (almost) asking if the file named "=" exists; I say "almost" > because it's actually an error since switch -e only accepts one > argument, but it's being given two arguments, "=" and "-". > > You might say that having a file named "-e" (or similar) is unlikely, > however, what is not unlikely is a caller passing "-" for > standard-input as $1. In this case, 'test' sees: > > test - = - > > which may or may not be an error in a particular implementation of > 'test'. Some implementations may understand that "-" is not a valid > switch, thus infer that you're actually asking for an equality > comparison between arguments, but other implementations may complain > either that there is no switch named "-" or that those arguments > simply make no sense. > > This is why it's a very common idiom in shell programming with 'test' > to see "x" prepended, thus ensuring that the argument can't be > confused with a switch.
Thanks for a careful and helpful explanation, as always :-). Makes sense to me.
Thanks, Taylor