From: Eric Sunshine <sunshine@sunshineco.com>
To: Taylor Blau <me@ttaylorr.com>
Cc: Git List <git@vger.kernel.org>, Elijah Newren <newren@gmail.com>,
Junio C Hamano <gitster@pobox.com>,
Shourya Shukla <shouryashukla.oo@gmail.com>
Subject: Re: [PATCH v2] test_cmp: diagnose incorrect arguments
Date: Tue, 11 Aug 2020 15:25:03 -0400 [thread overview]
Message-ID: <CAPig+cSroWZEoOL78COmPS4rkvKLE-yCiqh6Part+5gUgVon+A@mail.gmail.com> (raw)
In-Reply-To: <20200811183258.GB33865@syl.lan>
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.
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.
next prev parent reply other threads:[~2020-08-11 19:25 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-08-09 6:08 [PATCH] test_cmp: diagnose incorrect arguments Eric Sunshine
2020-08-09 8:32 ` Shourya Shukla
2020-08-09 8:49 ` Eric Sunshine
2020-08-09 17:42 ` [PATCH v2] " Eric Sunshine
2020-08-09 19:12 ` Junio C Hamano
2020-08-09 19:34 ` Eric Sunshine
2020-08-10 15:22 ` Junio C Hamano
2020-08-11 18:32 ` Taylor Blau
2020-08-11 19:25 ` Eric Sunshine [this message]
2020-08-11 21:03 ` Taylor Blau
2020-08-12 15:37 ` Jeff King
2020-08-12 16:15 ` Eric Sunshine
2020-08-12 16:39 ` Eric Sunshine
2020-08-12 17:10 ` Jeff King
2020-10-16 0:17 ` Jeff King
2020-10-16 2:18 ` Eric Sunshine
2020-10-16 18:36 ` Junio C Hamano
2020-10-16 20:56 ` Junio C Hamano
2020-10-16 23:14 ` Junio C Hamano
2020-10-17 6:06 ` Eric Sunshine
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CAPig+cSroWZEoOL78COmPS4rkvKLE-yCiqh6Part+5gUgVon+A@mail.gmail.com \
--to=sunshine@sunshineco.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=me@ttaylorr.com \
--cc=newren@gmail.com \
--cc=shouryashukla.oo@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).