Documentation: add shell guidelines

Add the following guideline to Documentation/CodingGuidelines:

	Break overlong lines after "&&", "||", and "|", not before
	them; that way the command can continue to subsequent lines
	without backslash at the end.

And the following to t/README (since it is specific to writing tests):

	Pipes and $(git ...) should be avoided when they swallow exit
	codes of Git processes

Signed-off-by: Matthew DeVore <matvore@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Matthew DeVore 2018-10-05 14:54:02 -07:00 committed by Junio C Hamano
parent 441ee35d83
commit a378fee5b0
2 changed files with 45 additions and 0 deletions

View file

@ -118,6 +118,24 @@ For shell scripts specifically (not exhaustive):
do this do this
fi fi
- If a command sequence joined with && or || or | spans multiple
lines, put each command on a separate line and put && and || and |
operators at the end of each line, rather than the start. This
means you don't need to use \ to join lines, since the above
operators imply the sequence isn't finished.
(incorrect)
grep blob verify_pack_result \
| awk -f print_1.awk \
| sort >actual &&
...
(correct)
grep blob verify_pack_result |
awk -f print_1.awk |
sort >actual &&
...
- We prefer "test" over "[ ... ]". - We prefer "test" over "[ ... ]".
- We do not write the noiseword "function" in front of shell - We do not write the noiseword "function" in front of shell

View file

@ -474,6 +474,33 @@ And here are the "don'ts:"
platform commands; just use '! cmd'. We are not in the business platform commands; just use '! cmd'. We are not in the business
of verifying that the world given to us sanely works. of verifying that the world given to us sanely works.
- Don't feed the output of a git command to a pipe, as in:
git -C repo ls-files |
xargs -n 1 basename |
grep foo
which will discard git's exit code and may mask a crash. In the
above example, all exit codes are ignored except grep's.
Instead, write the output of that command to a temporary
file with ">" or assign it to a variable with "x=$(git ...)" rather
than pipe it.
- Don't use command substitution in a way that discards git's exit
code. When assigning to a variable, the exit code is not discarded,
e.g.:
x=$(git cat-file -p $sha) &&
...
is OK because a crash in "git cat-file" will cause the "&&" chain
to fail, but:
test "refs/heads/foo" = "$(git symbolic-ref HEAD)"
is not OK and a crash in git could go undetected.
- Don't use perl without spelling it as "$PERL_PATH". This is to help - Don't use perl without spelling it as "$PERL_PATH". This is to help
our friends on Windows where the platform Perl often adds CR before our friends on Windows where the platform Perl often adds CR before
the end of line, and they bundle Git with a version of Perl that the end of line, and they bundle Git with a version of Perl that