[Pkg-shadow-devel] newusers.8: Some remarks and a patch with editorial changes for this man page

Bjarni Ingi Gislason bjarniig at simnet.is
Fri Oct 9 20:45:06 BST 2026


Package: passwd
Version: 1:4.20.2-2
Severity: minor
Tags: patch

  Additional remarks.

  Mails from me to "submit at bugs.debian.org" are no longer acknowledged.  A
Debian maintainer told me, that he would contact the mail administrator
about me not wanting to send bugs upstream.

  See also Debian bug #1141378 reportbug: Automatic forwarding of upstream
bugs.

-.-

Dear Maintainer,

>From "ftp.debian.org/debian/doc/bug-reporting.txt"

Don't file bugs upstream

   If you file a bug in Debian, don't send a copy to the upstream software
   maintainers yourself to start with, as it is possible that the bug
   exists only in Debian. If necessary, the maintainer of the package will
   forward the bug upstream, or ask you to do so after they've checked
   that it isn't Debian-specific.

-.-

  For forwarding bug reports to upstream see:

https://www.debian.org/Bugs/Developer#forward

-.-

  "Handling bug reports" in
http://people.debian.org/~enrico/dcg/ch03s02.html

-.-

  I do not send reports upstream if I have to get an account there.
The Debian maintainers have one already.

-.-

   * What led up to the situation?

     Checking for defects with a new version

test-[g|n]roff -mandoc -t -K utf8 -rF0 -rHY=0 -rCHECKSTYLE=0 -ww -z < "man page"

  [Use 

grep -n -e ' $' -e '\\~$' -e ' \\f.$' -e ' \\"' -e ' "$' <file>

  to find (most) trailing spaces.]

  ["test-groff" is a script in the repository for "groff"; is not shipped]
(local copy and "troff" slightly changed by me).

  [The fate of "test-nroff" was decided in groff bug #55941.]

   * What was the outcome of this action?

Output from "test-groff  -mandoc  -K utf8 -rF0 -rHY=0 -ww -z  -t":

troff:<stdin>:103: warning: trailing whitespace [-w trail]
an.tmac:<newusers.8>:376: style: unbalanced .RE
troff:<newusers.8>:380: warning: trailing whitespace [-w trail]
an.tmac:<newusers.8>:567: style: unbalanced .RE
troff:<newusers.8>:571: warning: trailing whitespace [-w trail]

   * What outcome did you expect instead?

     No output (no warnings).

-.-

  General remarks and further material, if a diff-file exist, are in the
attachments.


-- System Information:
Debian Release: forky/sid
  APT prefers testing
  APT policy: (500, 'testing')
Architecture: amd64 (x86_64)

Kernel: Linux 7.2.8+deb14-amd64 (SMP w/2 CPU threads; PREEMPT)
Locale: LANG=is_IS.iso88591, LC_CTYPE=is_IS.iso88591 (charmap=UTF-8) (ignored: LC_ALL set to C.utf8), LANGUAGE not set
Shell: /bin/sh linked to /usr/bin/dash
Init: sysvinit (via /sbin/init)

Versions of packages passwd depends on:
ii  base-passwd     3.6.8
ii  libacl1         2.4.0-1
ii  libaudit1       1:4.1.2-1+b2
ii  libbsd0         0.12.2-3
ii  libc6           2.43-6
ii  libcrypt1       1:4.5.2+20251210-1
ii  libpam-modules  1.7.0-8
ii  libpam0g        1.7.0-8
ii  libselinux1     3.11-2.1
ii  libsemanage2    3.11-1+b1
ii  login.defs      1:4.20.2-2

Versions of packages passwd recommends:
ii  sensible-utils  0.0.26

passwd suggests no packages.

-- no debconf information
-------------- next part --------------
Input file is newusers.8

Output from "mandoc -T lint  newusers.8": (shortened list)

      2 ERROR: skipping end of block that is not open: RE
     32 STYLE: input text line longer than 80 bytes
      6 WARNING: skipping paragraph macro: PP after SH

-.-.

Show if docman-to-man created this.

  A patch to a generated man page is to show where the generator
failed to make a "clean" man page rendering (that is without warnings) and
sometimes to show a better format for it.
  Generated files create bigger and more difficult to read/check patches
when the generator creats long lines, instead of shorter ones or by
postprocesing its output in such a way.

  A patch may be applied to a generated man page to fix it before distribution,
until the sources of the defects have been fixed.

4:.\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>

-.-.

Remove space characters (whitespace) at the end of lines.
Use "git apply ... --whitespace=fix" to fix extra space issues, or use
global configuration "core.whitespace".

See more information in the attachment "trailing.whitespace.txt".

Number of lines affected is

6

-.-.


Find a repeated word

! 300 --> lB
! 309 --> l
! 309 --> l
! 310 --> l
! 310 --> l
! 310 --> l
! 311 --> l
! 311 --> l
! 311 --> l
! 312 --> l
! 312 --> l
! 491 --> lB
! 500 --> l
! 500 --> l
! 501 --> l
! 501 --> l
! 501 --> l
! 502 --> l
! 502 --> l
! 502 --> l
! 503 --> l
! 503 --> l

-.-.

Test nr. 33:

Wrong distance (not two spaces, not a new line character (\n)) between
sentences in the input file.

mandoc(1) says: "New sentence, new line."

  Separate the sentences and subordinate clauses; each begins on a new
line.  See man-pages(7) ("Conventions for source file layout") and
"info groff" ("Input Conventions").

  The best procedure is to always start a new sentence on a new line,
at least, if you are typing on a computer.

Remember coding: Only one command ("sentence") on each (logical) line.

E-mail: Easier to quote exactly the relevant lines.

Generally: Easier to edit the sentence.

Patches: Less unaffected text.

Search for two adjacent words is easier, when they belong to the same line,
and the same phrase.

  The amount of space between sentences in the output can then be
controlled with the ".ss" request.

Mark a final abbreviation point as such by suffixing it with "\&".

Some sentences (etc.) do not begin on a new line.

Split (sometimes) lines after a punctuation mark; before a conjunction.

  Lines with only one (or two) space(s) between sentences could be split,
so latter sentences begin on a new line.

Use

#!/usr/bin/sh

sed -e '/^\./n' \
-e 's/\([[:alpha:]]\)\.  */\1.\n/g' $1

to split lines after a sentence period.
Check result with the difference between the formatted outputs.
See also the attachment "general.bugs"

[List of affected lines removed.]

41:(or the standard input by default) and uses this information to update a set of existing users or to create new users\&. Each line is in the same format as the standard password file (see
51:\fBnewusers\fR)\&. In case of an existing user, the user\*(Aqs information will be changed, otherwise a new user will be created\&.
81:If this field is a number, this number will be used as the primary group ID of the user\&. If no groups exist with this GID, a new group will be created with this GID, and the name of the user\&.
102:If this field does not specify an existing directory, the specified directory is created, with ownership set to the user being created or updated and its primary group\&. Note that
104:of the new user\*(Aqs home directory\&. The newusers command will fail to create the home directory if the parent directories do not exist, and will send a message to stderr informing the user of the failure\&. The newusers command will not halt or return a failure to the calling shell if it fails to create the home directory, it will continue to process the batch of new users specified\&.
108:does not move or copy the content of the old directory to the new location\&. This should be done manually\&.
113:This field defines the shell of the user\&. No checks are performed on this field\&.
117:first tries to create or change all the specified users, and then write these changes to the user or group databases\&. If an error occurs (except in the final writes to the databases), no changes are committed to the databases\&.
119:During this first pass, users are created with a locked password (and passwords are not changed for the users which are not created)\&. A second pass is used to update the passwords using PAM\&. Failures to update a password are reported, but will not stop the other password updates\&.
159:directory\&. Only absolute paths are supported\&. No SELINUX support\&.
180:\fBGID_MAX\fR) is 1000 (resp\&. 60000)\&.
185:The mode for new home directories\&. If not specified, the
197:Maximum members per group entry\&. When the maximum is reached, a new group entry (line) is started in
203:This feature (split group) permits to limit the length of lines in the group file\&. This is useful to make sure that lines for NIS groups are not larger than 1024 characters\&.
207:Note: split groups may not be supported by all tools (even in the Shadow toolsuite)\&. You should not use this variable unless you really need it\&.
212:The maximum number of days a password may be used\&. If the password is older than this, a password change will be forced\&. If not specified, \-1 will be assumed (which disables the restriction)\&.
217:The number of days warning given before a password expires\&. A zero means warning is given only upon the day of expiration, a value of \-1 means no warning is given\&. If not specified, no warning will be provided\&.
250:will calculate subordinate GID ranges deterministically based on the user\*(Aqs UID instead of searching for the next free range\&. The formula used is:
264:This ensures the same UID always receives the same subordinate GID range on every system, making it suitable for environments with centralized user management (LDAP, NIS, etc\&.) or synchronized UIDs across systems\&.
280:will change the ranges calculated\&. Users with identities less than
287:via network storage (NFS, etc\&.)\&. Mixing allocation methods
379:\fB WARNING: SECURITY RISK \- MAY CAUSE RANGE OVERLAPS AND PRIVILEGE ESCALATION! \fR
388:(WRAP MODE), allows the deterministic range calculation to wrap around using modulo arithmetic when a UID would overflow the configured subordinate ID space\&. The subordinate ID space is treated as a ring buffer\&.
390:\fBWARNING\fR: Range overlaps can lead to container escapes and privilege escalation\&. For example, with
393:\fBSUB_GID_COUNT\fR=65536, User A (UID 1000) gets range [100000, 165535] and User B (UID 1001) wraps and overlaps with User A\&. User B\*(Aqs container can now access files from User A\*(Aqs containers\&.
403:is a hard error\&. This guarantees non\-overlapping, monotonic allocation\&.
441:will calculate subordinate UID ranges deterministically based on the user\*(Aqs UID instead of searching for the next free range\&. The formula used is:
455:This ensures the same UID always receives the same subordinate UID range on every system, making it suitable for environments with centralized user management (LDAP, NIS, etc\&.) or synchronized UIDs across systems\&.
471:will change the ranges calculated\&. Users with identities less than
478:via network storage (NFS, etc\&.)\&. Mixing allocation methods
570:\fB WARNING: SECURITY RISK \- MAY CAUSE RANGE OVERLAPS AND PRIVILEGE ESCALATION! \fR
579:(WRAP MODE), allows the deterministic range calculation to wrap around using modulo arithmetic when a UID would overflow the configured subordinate ID space\&. The subordinate ID space is treated as a ring buffer\&.
581:\fBWARNING\fR: Range overlaps can lead to container escapes and privilege escalation\&. For example, with
584:\fBSUB_UID_COUNT\fR=65536, User A (UID 1000) gets range [100000, 165535] and User B (UID 1001) wraps and overlaps with User A\&. User B\*(Aqs container can now access files from User A\*(Aqs containers\&.
594:is a hard error\&. This guarantees non\-overlapping, monotonic allocation\&.
640:\fBUID_MAX\fR) is 1000 (resp\&. 60000)\&.
645:The file mode creation mask is initialized to this value\&. If not specified, the mask will be initialized to 022\&.

-.-.

Test nr. 34:

Split lines longer than 80 characters (fill completely
an A4 sized page line on a terminal)
into two or more lines.
Appropriate break points are the end of a sentence and a subordinate
clause; after punctuation marks.

[List of affected lines removed.]


Line 10, length 87

.TH "NEWUSERS" "8" "09/28/2026" "shadow\-utils 4\&.20\&.2" "System Management Commands"

Line 41, length 187

(or the standard input by default) and uses this information to update a set of existing users or to create new users\&. Each line is in the same format as the standard password file (see

Line 50, length 93

It can be the name of a new user or the name of an existing user (or a user created before by

Line 51, length 131

\fBnewusers\fR)\&. In case of an existing user, the user\*(Aqs information will be changed, otherwise a new user will be created\&.

Line 56, length 103

If this field is not empty, it will be encrypted and used as the new value of the encrypted password\&.

Line 68, length 92

If this field contains the name of an existing user (or the name of a user created before by

Line 71, length 113

If the UID of an existing user is changed, the files ownership of the user\*(Aqs file should be fixed manually\&.

Line 78, length 82

If this field contains the name of an existing group (or a group created before by

Line 79, length 91

\fBnewusers\fR), the GID of this group will be used as the primary group ID for the user\&.

Line 81, length 195

If this field is a number, this number will be used as the primary group ID of the user\&. If no groups exist with this GID, a new group will be created with this GID, and the name of the user\&.

Line 83, length 120

If this field is empty, a new group will be created with the name of the user and a GID will be automatically defined by

Line 85, length 83

to be used as the primary group ID for the user and as the GID for the new group\&.

Line 87, length 94

If this field contains the name of a group which does not exist (and was not created before by

Line 88, length 111

\fBnewusers\fR), a new group will be created with the specified name and a GID will be automatically defined by

Line 102, length 180

If this field does not specify an existing directory, the specified directory is created, with ownership set to the user being created or updated and its primary group\&. Note that

Line 104, length 392

of the new user\*(Aqs home directory\&. The newusers command will fail to create the home directory if the parent directories do not exist, and will send a message to stderr informing the user of the failure\&. The newusers command will not halt or return a failure to the calling shell if it fails to create the home directory, it will continue to process the batch of new users specified\&.

Line 108, length 109

does not move or copy the content of the old directory to the new location\&. This should be done manually\&.

Line 113, length 84

This field defines the shell of the user\&. No checks are performed on this field\&.

Line 117, length 230

first tries to create or change all the specified users, and then write these changes to the user or group databases\&. If an error occurs (except in the final writes to the databases), no changes are committed to the databases\&.

Line 119, length 286

During this first pass, users are created with a locked password (and passwords are not changed for the users which are not created)\&. A second pass is used to update the passwords using PAM\&. Failures to update a password are reported, but will not stop the other password updates\&.

Line 121, length 117

This command is intended to be used in a large system environment where many accounts are updated at a single time\&.

Line 197, length 102

Maximum members per group entry\&. When the maximum is reached, a new group entry (line) is started in

Line 201, length 95

The default value is 0, meaning that there are no limits in the number of members in a group\&.

Line 203, length 177

This feature (split group) permits to limit the length of lines in the group file\&. This is useful to make sure that lines for NIS groups are not larger than 1024 characters\&.

Line 207, length 148

Note: split groups may not be supported by all tools (even in the Shadow toolsuite)\&. You should not use this variable unless you really need it\&.

Line 212, length 198

The maximum number of days a password may be used\&. If the password is older than this, a password change will be forced\&. If not specified, \-1 will be assumed (which disables the restriction)\&.

Line 217, length 217

The number of days warning given before a password expires\&. A zero means warning is given only upon the day of expiration, a value of \-1 means no warning is given\&. If not specified, no warning will be provided\&.

Line 220, length 84

\fBSUB_GID_MIN\fR (number), \fBSUB_GID_MAX\fR (number), \fBSUB_GID_COUNT\fR (number)

Line 250, length 152

will calculate subordinate GID ranges deterministically based on the user\*(Aqs UID instead of searching for the next free range\&. The formula used is:

Line 264, length 217

This ensures the same UID always receives the same subordinate GID range on every system, making it suitable for environments with centralized user management (LDAP, NIS, etc\&.) or synchronized UIDs across systems\&.

Line 285, length 116

\fBWARNING\fR: Do not mix deterministic and linear (default) allocation on the same system or across systems sharing

Line 344, length 105

When planning subordinate ID allocation, calculate the maximum number of users the space can accommodate:

Line 379, length 84

\fB WARNING: SECURITY RISK \- MAY CAUSE RANGE OVERLAPS AND PRIVILEGE ESCALATION! \fR

Line 388, length 215

(WRAP MODE), allows the deterministic range calculation to wrap around using modulo arithmetic when a UID would overflow the configured subordinate ID space\&. The subordinate ID space is treated as a ring buffer\&.

Line 390, length 105

\fBWARNING\fR: Range overlaps can lead to container escapes and privilege escalation\&. For example, with

Line 393, length 204

\fBSUB_GID_COUNT\fR=65536, User A (UID 1000) gets range [100000, 165535] and User B (UID 1001) wraps and overlaps with User A\&. User B\*(Aqs container can now access files from User A\*(Aqs containers\&.

Line 411, length 84

\fBSUB_UID_MIN\fR (number), \fBSUB_UID_MAX\fR (number), \fBSUB_UID_COUNT\fR (number)

Line 441, length 152

will calculate subordinate UID ranges deterministically based on the user\*(Aqs UID instead of searching for the next free range\&. The formula used is:

Line 455, length 217

This ensures the same UID always receives the same subordinate UID range on every system, making it suitable for environments with centralized user management (LDAP, NIS, etc\&.) or synchronized UIDs across systems\&.

Line 476, length 116

\fBWARNING\fR: Do not mix deterministic and linear (default) allocation on the same system or across systems sharing

Line 535, length 105

When planning subordinate ID allocation, calculate the maximum number of users the space can accommodate:

Line 570, length 84

\fB WARNING: SECURITY RISK \- MAY CAUSE RANGE OVERLAPS AND PRIVILEGE ESCALATION! \fR

Line 579, length 215

(WRAP MODE), allows the deterministic range calculation to wrap around using modulo arithmetic when a UID would overflow the configured subordinate ID space\&. The subordinate ID space is treated as a ring buffer\&.

Line 581, length 105

\fBWARNING\fR: Range overlaps can lead to container escapes and privilege escalation\&. For example, with

Line 584, length 204

\fBSUB_UID_COUNT\fR=65536, User A (UID 1000) gets range [100000, 165535] and User B (UID 1001) wraps and overlaps with User A\&. User B\*(Aqs container can now access files from User A\*(Aqs containers\&.

Line 645, length 116

The file mode creation mask is initialized to this value\&. If not specified, the mask will be initialized to 022\&.

Longest line is: 392 characters.
Longest line is number 104 with 392 characters
of the new user\*(Aqs home directory\&. The newusers command will fail to create the home directory if the parent directories do not exist, and will send a message to stderr informing the user of the failure\&. The newusers command will not halt or return a failure to the calling shell if it fails to create the home directory, it will continue to process the batch of new users specified\&.

-.-.

Test nr. 55:

Do not use margin adjustments without an explanation of its necessity.

24-.nh
25-.\" disable justification (adjust text to left margin only)
26:.ad l
27-.\" -----------------------------------------------------------------
28-.\" * MAIN CONTENT STARTS HERE *

-.-.

Test nr. 65:

Put a parenthetical sentence, phrase on a separate line,
if not part of a code.
See man-pages(7), item "semantic newline".

[List of affected lines removed.]


newusers.8:117:first tries to create or change all the specified users, and then write these changes to the user or group databases\&. If an error occurs (except in the final writes to the databases), no changes are committed to the databases\&.
newusers.8:119:During this first pass, users are created with a locked password (and passwords are not changed for the users which are not created)\&. A second pass is used to update the passwords using PAM\&. Failures to update a password are reported, but will not stop the other password updates\&.
newusers.8:180:\fBGID_MAX\fR) is 1000 (resp\&. 60000)\&.
newusers.8:203:This feature (split group) permits to limit the length of lines in the group file\&. This is useful to make sure that lines for NIS groups are not larger than 1024 characters\&.
newusers.8:207:Note: split groups may not be supported by all tools (even in the Shadow toolsuite)\&. You should not use this variable unless you really need it\&.
newusers.8:212:The maximum number of days a password may be used\&. If the password is older than this, a password change will be forced\&. If not specified, \-1 will be assumed (which disables the restriction)\&.
newusers.8:256:      start = SUB_GID_MIN + ((UID \- UID_MIN) * SUB_GID_COUNT)
newusers.8:264:This ensures the same UID always receives the same subordinate GID range on every system, making it suitable for environments with centralized user management (LDAP, NIS, etc\&.) or synchronized UIDs across systems\&.
newusers.8:287:via network storage (NFS, etc\&.)\&. Mixing allocation methods
newusers.8:350:      capacity = (SUB_GID_MAX \- SUB_GID_MIN) / SUB_GID_COUNT
newusers.8:357:With default values: (600100000 \- 100000) / 65536 ??? 9155 users\&.
newusers.8:374:This gives: (10000000 \- 100000) / 4096 ??? 2417 users\&.
newusers.8:393:\fBSUB_GID_COUNT\fR=65536, User A (UID 1000) gets range [100000, 165535] and User B (UID 1001) wraps and overlaps with User A\&. User B\*(Aqs container can now access files from User A\*(Aqs containers\&.
newusers.8:447:      start = SUB_UID_MIN + ((UID \- UID_MIN) * SUB_UID_COUNT)
newusers.8:455:This ensures the same UID always receives the same subordinate UID range on every system, making it suitable for environments with centralized user management (LDAP, NIS, etc\&.) or synchronized UIDs across systems\&.
newusers.8:478:via network storage (NFS, etc\&.)\&. Mixing allocation methods
newusers.8:541:      capacity = (SUB_UID_MAX \- SUB_UID_MIN) / SUB_UID_COUNT
newusers.8:548:With default values: (600100000 \- 100000) / 65536 ??? 9155 users\&.
newusers.8:565:This gives: (10000000 \- 100000) / 4096 ??? 2417 users\&.
newusers.8:584:\fBSUB_UID_COUNT\fR=65536, User A (UID 1000) gets range [100000, 165535] and User B (UID 1001) wraps and overlaps with User A\&. User B\*(Aqs container can now access files from User A\*(Aqs containers\&.
newusers.8:640:\fBUID_MAX\fR) is 1000 (resp\&. 60000)\&.

-.-.

Test nr. 68:

Use "\(en" (en-dash) (or the word to) to indicate a range,
not a minus (\-); this is not a substraction

357:With default values: (600100000 \- 100000) / 65536 ??? 9155 users\&.
374:This gives: (10000000 \- 100000) / 4096 ??? 2417 users\&.
548:With default values: (600100000 \- 100000) / 65536 ??? 9155 users\&.
565:This gives: (10000000 \- 100000) / 4096 ??? 2417 users\&.

-.-.

Test nr. 84:

No need for '\&' to be in front of a period (.),
if there is a character in front of it.

Remove with "sed -e 's/\(.\)\\&\./\1./g'".


use_of_case = 111
111 lines are with such a use.
newusers.8

-.-.

Test nr. 86:

Only one space character is after a possible end of sentence
(after a punctuation, that can end a sentence).
Start a new sentence on a new line.

mandoc(1) says "New sentence, new line."

[List of affected lines removed.]


newusers.8:41:(or the standard input by default) and uses this information to update a set of existing users or to create new users\&. Each line is in the same format as the standard password file (see
newusers.8:51:\fBnewusers\fR)\&. In case of an existing user, the user\*(Aqs information will be changed, otherwise a new user will be created\&.
newusers.8:81:If this field is a number, this number will be used as the primary group ID of the user\&. If no groups exist with this GID, a new group will be created with this GID, and the name of the user\&.
newusers.8:102:If this field does not specify an existing directory, the specified directory is created, with ownership set to the user being created or updated and its primary group\&. Note that
newusers.8:104:of the new user\*(Aqs home directory\&. The newusers command will fail to create the home directory if the parent directories do not exist, and will send a message to stderr informing the user of the failure\&. The newusers command will not halt or return a failure to the calling shell if it fails to create the home directory, it will continue to process the batch of new users specified\&.
newusers.8:108:does not move or copy the content of the old directory to the new location\&. This should be done manually\&.
newusers.8:113:This field defines the shell of the user\&. No checks are performed on this field\&.
newusers.8:117:first tries to create or change all the specified users, and then write these changes to the user or group databases\&. If an error occurs (except in the final writes to the databases), no changes are committed to the databases\&.
newusers.8:119:During this first pass, users are created with a locked password (and passwords are not changed for the users which are not created)\&. A second pass is used to update the passwords using PAM\&. Failures to update a password are reported, but will not stop the other password updates\&.
newusers.8:159:directory\&. Only absolute paths are supported\&. No SELINUX support\&.
newusers.8:180:\fBGID_MAX\fR) is 1000 (resp\&. 60000)\&.
newusers.8:185:The mode for new home directories\&. If not specified, the
newusers.8:197:Maximum members per group entry\&. When the maximum is reached, a new group entry (line) is started in
newusers.8:203:This feature (split group) permits to limit the length of lines in the group file\&. This is useful to make sure that lines for NIS groups are not larger than 1024 characters\&.
newusers.8:207:Note: split groups may not be supported by all tools (even in the Shadow toolsuite)\&. You should not use this variable unless you really need it\&.
newusers.8:212:The maximum number of days a password may be used\&. If the password is older than this, a password change will be forced\&. If not specified, \-1 will be assumed (which disables the restriction)\&.
newusers.8:217:The number of days warning given before a password expires\&. A zero means warning is given only upon the day of expiration, a value of \-1 means no warning is given\&. If not specified, no warning will be provided\&.
newusers.8:250:will calculate subordinate GID ranges deterministically based on the user\*(Aqs UID instead of searching for the next free range\&. The formula used is:
newusers.8:280:will change the ranges calculated\&. Users with identities less than
newusers.8:287:via network storage (NFS, etc\&.)\&. Mixing allocation methods
newusers.8:379:\fB WARNING: SECURITY RISK \- MAY CAUSE RANGE OVERLAPS AND PRIVILEGE ESCALATION! \fR
newusers.8:388:(WRAP MODE), allows the deterministic range calculation to wrap around using modulo arithmetic when a UID would overflow the configured subordinate ID space\&. The subordinate ID space is treated as a ring buffer\&.
newusers.8:390:\fBWARNING\fR: Range overlaps can lead to container escapes and privilege escalation\&. For example, with
newusers.8:393:\fBSUB_GID_COUNT\fR=65536, User A (UID 1000) gets range [100000, 165535] and User B (UID 1001) wraps and overlaps with User A\&. User B\*(Aqs container can now access files from User A\*(Aqs containers\&.
newusers.8:403:is a hard error\&. This guarantees non\-overlapping, monotonic allocation\&.
newusers.8:441:will calculate subordinate UID ranges deterministically based on the user\*(Aqs UID instead of searching for the next free range\&. The formula used is:
newusers.8:471:will change the ranges calculated\&. Users with identities less than
newusers.8:478:via network storage (NFS, etc\&.)\&. Mixing allocation methods
newusers.8:570:\fB WARNING: SECURITY RISK \- MAY CAUSE RANGE OVERLAPS AND PRIVILEGE ESCALATION! \fR
newusers.8:579:(WRAP MODE), allows the deterministic range calculation to wrap around using modulo arithmetic when a UID would overflow the configured subordinate ID space\&. The subordinate ID space is treated as a ring buffer\&.
newusers.8:581:\fBWARNING\fR: Range overlaps can lead to container escapes and privilege escalation\&. For example, with
newusers.8:584:\fBSUB_UID_COUNT\fR=65536, User A (UID 1000) gets range [100000, 165535] and User B (UID 1001) wraps and overlaps with User A\&. User B\*(Aqs container can now access files from User A\*(Aqs containers\&.
newusers.8:594:is a hard error\&. This guarantees non\-overlapping, monotonic allocation\&.
newusers.8:640:\fBUID_MAX\fR) is 1000 (resp\&. 60000)\&.
newusers.8:645:The file mode creation mask is initialized to this value\&. If not specified, the mask will be initialized to 022\&.

-.-.

Test nr. 87:

Use thousand markers to make large numbers easy to read

15:.\" http://bugs.debian.org/507673
16:.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
180:\fBGID_MAX\fR) is 1000 (resp\&. 60000)\&.
240:are respectively 100000, 600100000 and 65536\&.
296:\fBSUB_GID_MIN\fR=100000,
297:\fBSUB_GID_COUNT\fR=65536):
316:100000 + ((1000\-1000) * 65536)
318:100000\-165535
323:100000 + ((1001\-1000) * 65536)
325:165536\-231071
330:100000 + ((1002\-1000) * 65536)
332:231072\-296607
337:100000 + ((1100\-1000) * 65536)
339:6653600\-6719135
357:With default values: (600100000 \- 100000) / 65536 ??? 9155 users\&.
366:        SUB_GID_MIN    100000
367:        SUB_GID_MAX    10000000
374:This gives: (10000000 \- 100000) / 4096 ??? 2417 users\&.
391:\fBSUB_GID_MIN\fR=100000,
392:\fBSUB_GID_MAX\fR=200000,
393:\fBSUB_GID_COUNT\fR=65536, User A (UID 1000) gets range [100000, 165535] and User B (UID 1001) wraps and overlaps with User A\&. User B\*(Aqs container can now access files from User A\*(Aqs containers\&.
431:are respectively 100000, 600100000 and 65536\&.
487:\fBSUB_UID_MIN\fR=100000,
488:\fBSUB_UID_COUNT\fR=65536):
507:100000 + ((1000\-1000) * 65536)
509:100000\-165535
514:100000 + ((1001\-1000) * 65536)
516:165536\-231071
521:100000 + ((1002\-1000) * 65536)
523:231072\-296607
528:100000 + ((1100\-1000) * 65536)
530:6653600\-6719135
548:With default values: (600100000 \- 100000) / 65536 ??? 9155 users\&.
557:        SUB_UID_MIN    100000
558:        SUB_UID_MAX    10000000
565:This gives: (10000000 \- 100000) / 4096 ??? 2417 users\&.
582:\fBSUB_UID_MIN\fR=100000,
583:\fBSUB_UID_MAX\fR=200000,
584:\fBSUB_UID_COUNT\fR=65536, User A (UID 1000) gets range [100000, 165535] and User B (UID 1001) wraps and overlaps with User A\&. User B\*(Aqs container can now access files from User A\*(Aqs containers\&.
640:\fBUID_MAX\fR) is 1000 (resp\&. 60000)\&.

-.-.

Test nr. 88:

Change "---" to an em dash

11:.\" -----------------------------------------------------------------
13:.\" -----------------------------------------------------------------
20:.\" -----------------------------------------------------------------
22:.\" -----------------------------------------------------------------
27:.\" -----------------------------------------------------------------
29:.\" -----------------------------------------------------------------

-.-.

Test nr. 90:

Remove quotes from an argument to a macro, when there is a printable
but no space character between them.  Such quotes provide no information.

10:.TH "NEWUSERS" "8" "09/28/2026" "shadow\-utils 4\&.20\&.2" "System Management Commands"
30:.SH "NAME"
32:.SH "SYNOPSIS"
35:.SH "DESCRIPTION"
122:.SH "OPTIONS"
161:.SH "CAVEATS"
164:.SH "CONFIGURATION"
658:.SH "FILES"

-.-.

Test nr. 96:

Use "\-" instead of "-" (rendered as a hyphen (u2010) in UTF-8 encoding)
in web addresses.

16:.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html

-.-.

Test nr. 97:

Put a (long) web address on a new output line to reduce the posibility of
splitting the address between two output lines.
Or inhibit hyphenation with "\%" in front of the name.


4:.\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
15:.\" http://bugs.debian.org/507673
16:.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html

-.-.

Test nr. 101:

Change comment lines of type '.\" ====', '.\" ---', and an empty
'.\"' line) to a single period, as they contain no information and waste
work each time they are processed.

9:.\"
11:.\" -----------------------------------------------------------------
13:.\" -----------------------------------------------------------------
14:.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
17:.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20:.\" -----------------------------------------------------------------
22:.\" -----------------------------------------------------------------
27:.\" -----------------------------------------------------------------
29:.\" -----------------------------------------------------------------

-.-.

chk_man: -.- File temp.table -.-.

Input file is temp.table, case 1
Test nr. 26:

Find a repeated word

! 3 --> lB
! 12 --> l
! 12 --> l
! 13 --> l
! 13 --> l
! 13 --> l
! 14 --> l
! 14 --> l
! 14 --> l
! 15 --> l
! 15 --> l
! 47 --> lB
! 56 --> l
! 56 --> l
! 57 --> l
! 57 --> l
! 57 --> l
! 58 --> l
! 58 --> l
! 58 --> l
! 59 --> l
! 59 --> l

-.-.

Test nr. 87:

Use thousand markers to make large numbers easy to read

19:100000 + ((1000\-1000) * 65536)
21:100000\-165535
26:100000 + ((1001\-1000) * 65536)
28:165536\-231071
33:100000 + ((1002\-1000) * 65536)
35:231072\-296607
40:100000 + ((1100\-1000) * 65536)
42:6653600\-6719135
63:100000 + ((1000\-1000) * 65536)
65:100000\-165535
70:100000 + ((1001\-1000) * 65536)
72:165536\-231071
77:100000 + ((1002\-1000) * 65536)
79:231072\-296607
84:100000 + ((1100\-1000) * 65536)
86:6653600\-6719135

-.-.

Test nr. 90:

Remove quotes from an argument to a macro, when there is a printable
but no space character between them.  Such quotes provide no information.


-.-.

Test nr. 103:

The first line of the man page should only contain information about the
preprocessing of tables, see man(1), chapter "DEFAULTS".

1: .TS

-.-.

Output from "test-groff  -mandoc  -K utf8 -rF0 -rHY=0 -ww -z  -t":

troff:<stdin>:103: warning: trailing whitespace [-w trail]
an.tmac:<newusers.8>:376: style: unbalanced .RE
troff:<newusers.8>:380: warning: trailing whitespace [-w trail]
an.tmac:<newusers.8>:567: style: unbalanced .RE
troff:<newusers.8>:571: warning: trailing whitespace [-w trail]

Output from "test-nroff  -mandoc  -K utf8 -rF0 -rHY=0 -ww -z  -t":

troff:<stdin>:103: warning: trailing whitespace [-w trail]
an.tmac:<newusers.8>:376: style: unbalanced .RE
troff:<newusers.8>:380: warning: trailing whitespace [-w trail]
an.tmac:<newusers.8>:567: style: unbalanced .RE
troff:<newusers.8>:571: warning: trailing whitespace [-w trail]

-.-

Additionally:

Size/bytes:



-.-

Generally:

Split (sometimes) lines after a punctuation mark; before a conjunction.

-.-

Tables:

  Use the preprocessor 'tbl' to make tables.

  Put data, that are wider than the header in the (centered) last column,
in a "T{...\nT}" block.

  Table headings, that are wider than any data in the corresponding
column, do not need to be centered, so left adjustment (l, L) is
sufficient.  There is thereby no change in the standard output.
-------------- next part --------------
--- newusers.8	2026-10-09 00:44:13.808855487 +0000
+++ newusers.8.new	2026-10-09 19:36:55.883148668 +0000
@@ -33,7 +33,6 @@ newusers \- update and create new users
 .HP \w'\fBnewusers\fR\ 'u
 \fBnewusers\fR [\fIoptions\fR] [\fIfile\fR]
 .SH "DESCRIPTION"
-.PP
 The
 \fBnewusers\fR
 command reads a
@@ -100,7 +99,7 @@ This field is copied in the GECOS field
 This field is used to define the home directory of the user\&.
 .sp
 If this field does not specify an existing directory, the specified directory is created, with ownership set to the user being created or updated and its primary group\&. Note that
-\fInewusers does not create parent directories \fR
+\fInewusers does not create parent directories\fR
 of the new user\*(Aqs home directory\&. The newusers command will fail to create the home directory if the parent directories do not exist, and will send a message to stderr informing the user of the failure\&. The newusers command will not halt or return a failure to the calling shell if it fails to create the home directory, it will continue to process the batch of new users specified\&.
 .sp
 If the home directory of an existing user is changed,
@@ -120,7 +119,6 @@ During this first pass, users are create
 .PP
 This command is intended to be used in a large system environment where many accounts are updated at a single time\&.
 .SH "OPTIONS"
-.PP
 The options which apply to the
 \fBnewusers\fR
 command are:
@@ -159,10 +157,8 @@ directory and use the configuration file
 directory\&. Only absolute paths are supported\&. No SELINUX support\&.
 .RE
 .SH "CAVEATS"
-.PP
 The input file must be protected since it contains unencrypted passwords\&.
 .SH "CONFIGURATION"
-.PP
 The following configuration variables in
 /etc/login\&.defs
 change the behavior of this tool:
@@ -306,37 +302,34 @@ T}:T{
 Subordinate GID Range
 T}
 .T&
-l l l
-l l l
-l l l
 l l l.
 T{
 1000
 T}:T{
 100000 + ((1000\-1000) * 65536)
 T}:T{
-100000\-165535
+100000\(en165535
 T}
 T{
 1001
 T}:T{
 100000 + ((1001\-1000) * 65536)
 T}:T{
-165536\-231071
+165536\(en231071
 T}
 T{
 1002
 T}:T{
 100000 + ((1002\-1000) * 65536)
 T}:T{
-231072\-296607
+231072\(en296607
 T}
 T{
 1100
 T}:T{
 100000 + ((1100\-1000) * 65536)
 T}:T{
-6653600\-6719135
+6653600\(en6719135
 T}
 .TE
 .sp 1
@@ -372,11 +365,10 @@ For high\-density environments with many
 .\}
 .sp
 This gives: (10000000 \- 100000) / 4096 ??? 2417 users\&.
-.RE
 .PP
 \fBUNSAFE_SUB_GID_DETERMINISTIC_WRAP\fR (boolean)
 .RS 4
-\fB WARNING: SECURITY RISK \- MAY CAUSE RANGE OVERLAPS AND PRIVILEGE ESCALATION! \fR
+\fB WARNING: SECURITY RISK \- MAY CAUSE RANGE OVERLAPS AND PRIVILEGE ESCALATION!\fR
 .sp
 Only effective when
 \fBSUB_GID_DETERMINISTIC\fR
@@ -497,37 +489,34 @@ T}:T{
 Subordinate UID Range
 T}
 .T&
-l l l
-l l l
-l l l
 l l l.
 T{
 1000
 T}:T{
 100000 + ((1000\-1000) * 65536)
 T}:T{
-100000\-165535
+100000\(en165535
 T}
 T{
 1001
 T}:T{
 100000 + ((1001\-1000) * 65536)
 T}:T{
-165536\-231071
+165536\(en231071
 T}
 T{
 1002
 T}:T{
 100000 + ((1002\-1000) * 65536)
 T}:T{
-231072\-296607
+231072\(en296607
 T}
 T{
 1100
 T}:T{
 100000 + ((1100\-1000) * 65536)
 T}:T{
-6653600\-6719135
+6653600\(en6719135
 T}
 .TE
 .sp 1
@@ -563,16 +552,15 @@ For high\-density environments with many
 .\}
 .sp
 This gives: (10000000 \- 100000) / 4096 ??? 2417 users\&.
-.RE
 .PP
 \fBUNSAFE_SUB_UID_DETERMINISTIC_WRAP\fR (boolean)
 .RS 4
-\fB WARNING: SECURITY RISK \- MAY CAUSE RANGE OVERLAPS AND PRIVILEGE ESCALATION! \fR
+\fB WARNING: SECURITY RISK \- MAY CAUSE RANGE OVERLAPS AND PRIVILEGE ESCALATION!\fR
 .sp
 Only effective when
 \fBSUB_UID_DETERMINISTIC\fR
 is set to
-\fIyes\fR\&.
+\fIyes\fR.
 .sp
 When set to
 \fIyes\fR
@@ -656,7 +644,6 @@ It is also used by
 as the default umask value\&.
 .RE
 .SH "FILES"
-.PP
 /etc/passwd
 .RS 4
 User account information\&.
@@ -698,7 +685,6 @@ Per user subordinate group IDs\&.
 Per user subordinate user IDs\&.
 .RE
 .SH "SEE ALSO"
-.PP
 \fBlogin.defs\fR(5),
 \fBpasswd\fR(1),
 \fBsubgid\fR(5), \fBsubuid\fR(5),
-------------- next part --------------
  Check the output from "lintian" in the Debian distribution.

  Any program (person), that produces man pages, should check the output
for defects by using (both groff and nroff)

[gn]roff -mandoc -t -ww -b -z -K utf8 <man page>

  To find most trailing spaces use

grep -n -e ' $' -e ' \\f.$' -e ' \\"' -e ' "$' <man page>

  The same goes for man pages that are used as an input.

-.-

  For a style guide use

  mandoc -T lint

-.-

  For general input conventions consult the man page "nroff(7)" (item
"Input conventions") or the Texinfo manual about the same item.

-.-

  Any "autogenerator" should check its products with the above mentioned
'groff', 'mandoc', and additionally with 'nroff ...'.

  It should also check its input files for too long (> 80) lines.

  This is just a simple quality control measure.

  The "autogenerator" may have to be corrected to get a better man page,
the source file may, and any additional file may.

  Debian can fix simple bugs in the used generators and distribute them,
and does not need to wait for upstream to do that and distribute them.

-.-

  Common defects:

  Not removing trailing spaces (in in- and output).
  The reason for these trailing spaces should be found and eliminated.

  "git" has a "tool" to point out whitespace,
see for example "git-apply(1)" and git-config(1)")

-.-

  Not beginning each input sentence on a new line.

Line length and patch size should thus be reduced when that has been fixed.

  The script "reportbug" uses 'quoted-printable' encoding when a line is
longer than 1024 characters in an 'ascii' file.

  See man-pages(7), item "semantic newline".

-.-

The difference between the formatted output of the original and patched
file can be seen with a script "cmp.manuals" in the attachment.

  Or

  nroff -mandoc <file1> > <out1>
  nroff -mandoc <file2> > <out2>
  diff -d -u <out1> <out2>

and for groff, using

printf '%s\n%s\n' '.kern 0' '.ss 12 0' | groff -mandoc -Z -

instead of 'nroff -mandoc'

  Add the option '-t', if the file contains a table.

  Read the output from 'diff -d -u ...' with 'less -R' or similar.

-.-.

  If 'man' (man-db) is used to check the manual for warnings,
the following must be set:

  The option "-warnings=w"

  The environmental variable:

export MAN_KEEP_STDERR=yes (or any non-empty value)

  or

  (produce only warnings):

export MANROFFOPT="-ww -b -z"

export MAN_KEEP_STDERR=yes (or any non-empty value)

-.-
-------------- next part --------------
#!/usr/bin/bash
# Compare two versions of a man page
# command old{file, directory} new{file, directory}
# command oldfile newfile
# command olddirectory newdirectory

set -eu
option=''
man_option='-mandoc' #-mandoc
Cmd_name=${0##*/}
echo main: parameters are $*

while getopts cd:em:r: opt
do
  case $opt in
    c) man_option="-rcR=1"
    ;;
    d) man_option="-d$OPTARG"
    ;;
    e) option=exact
    ;;
    m) man_option="-m$OPTARG"
    ;;
    r) man_option="-r$OPTARG"
    ;;
    *) echo cmp.manuals: Error, wrong option \"$*\" >&2
      exit
    ;;
  esac
done

shift $((OPTIND - 1))
#echo main: option is $man_option ; exit 1
#echo main: parameters are $*
# Add appropriate options
if test \! -f "$1"
then
  echo file $1 does not exist
  exit 1
fi

if test \! -f "$2"
then
  echo file $2 does not exist
  exit 1
fi

case $man_option in
  -man) man_option='-man -t -dAD=l -rHY=0'
  ;;
  -mandoc) man_option='-mandoc -t -dAD=l -rHY=0'
  ;;
  -me) man_option='-me'
  ;;
  -ms) man_option='-ms -rpar*adj=0'
  ;;
  -d*|-r*) :
  ;;
  *) echo ${Cmd_name}: Unknown option for the macro packet $man_option
     exit 1
  ;;
esac

tempuniq=$(mktemp --tmpdir $Cmd_name.XXXXXX )

uniqlines () {
uniq -d $inputX | sed -e '/^$/d' > $tempuniq
if test -s $tempuniq ; then
  echo $Cmd_name: Equal lines in input from $inputX
  cat $tempuniq
  return 1
fi
return 0
}

compare () {
#printf 'option is %s\n' $option
inputA=old.${1##*/}
inputB=new.${2##*/}
if test ! $1 -ef /tmp/$inputA ; then
  echo copy $1 to /tmp/$inputA
  cp $1 /tmp/$inputA
fi

if test ! $2 -ef /tmp/$inputB ; then
  echo copy $2 /tmp/$inputB
  cp $2 /tmp/$inputB
fi

olddir=$PWD
cd /tmp

#MAN_KEEP_STDERR=yes
#MANOPT='--warnings=w --no-justification --no-hyphenation'
#MANWIDTH=80
#export MAN_KEEP_STDERR MANOPT MANWIDTH

# Have no sentence space (.ss 12 0)
#echo option is \"$option\"; exit 1

# getopt sets opt=? if there is no option
#echo opt is \"$opt\" >&2
if test "$opt" = '?' ; then
  sed -e '/^.TH /i \
.ss 12 0\
.nr cR 1\
.kern 0\
.lg 0
s/\. *ad$/.ad l/
s/\. *ad /.ad l /
' $inputA
else
  cat $inputA 
fi | tee -p $inputA.intermed | \
test-nroff -t -K utf8  $man_option > $inputA.txt 2> /dev/null
#echo test-nroff man_option is $man_option for output inputA.txt >&2
# Check
echo inputA.txt from old version
ls -l $inputA.intermed
ls -l $inputA.txt

if find_cntrl $inputA.txt > /dev/null 2>&1
then
  :
else
  echo No formatting characters in file $inputA.txt >&2
fi

inputX=$inputA.txt

#if uniqlines ; then
# Remove multible empty lines
#  uniq $inputA.txt > $tempuniq
#  cp $tempuniq $inputA.txt
#fi

#echo opt is \"$opt\" >&2

if test "$opt" = '?' ; then
#echo opt is \"$opt\" >&2
  sed -e '/^.TH /i \
.ss 12 0\
.nr cR 1\
.kern 0\
.lg 0
s/\. *ad$/.ad l/
s/\. *ad /.ad l /
' $inputB
else 
  cat $inputB
fi | tee -p $inputB.intermed | \
test-nroff -t -K utf8  $man_option > ${inputB}.txt 2> /dev/null
#echo test-nroff man_option is $man_option >&2
#Check
echo inputB from new version
ls -l $inputB.intermed
ls -l $inputB.txt

if find_cntrl ${inputB}.txt > /dev/null 2>&1
then
  :
else
  echo No formatting characters in file ${inputB}.txt >&2
fi

inputX=${inputB}.txt

#if uniqlines ; then
# Remove multible empty lines
#  uniq $inputA.txt > $tempuniq
#  cp $tempuniq $inputB.txt
#fi

#echo using diff.loc >&2

diff.loc -d $inputA.txt $inputB.txt > $inputA.txt.diff || :

# Difference in the output of "troff"

if test "$opt" = '?' ; then
  sed -e '/^.TH /i \
.ss 12 0\
.nr cR 1\
.kern 0
s/\. *ad$/.ad l/
s/\. *ad /.ad l /
' $inputA
else
  cat $inputA 
fi | test-groff -t $man_option -K utf8 -Z \
   > $inputA.ml 2> /dev/null
#echo test-groff man_option is $man_option >&2
#ls -l $inputA.ml
#stat $inputA.ml

if test \! -s $inputA.ml; then
  echo $Cmd_name: intermediate file $inputA.ml is not produced >&2
  ls -lt $inputA >&2
  exit 1
fi

if test "$opt" = '?' ; then
  sed -e '/^.TH /i \
.ss 12 0\
.nr cR 1\
.kern 0
s/\. *ad$/.ad l/
s/\. *ad /.ad l /
' $inputB
else
  cat $inputB
fi | tee -p /tmp/input.to.groff | \
  test-groff -t $man_option -Z -K utf8\
      > $inputB.ml #2> /dev/null
#echo test-groff man_option is $man_option >&2
if test \! -s $inputB.ml; then
  echo $Cmd_name: intermediate file $inputB.ml is not produced >&2
  ls -l /tmp/input.to.groff >&2
  exit 1
fi

#stat $inputB.ml

#ls -l $inputB.ml 1>&2
#printf 'option is = %s\n' "$option"
if test "$option" = 'exact'; then
#  echo Using diff.loc >&2
  diff.loc -d $inputA.ml $inputB.ml | \
    sed -e '/^[-]V[0-9]\+$/d' -e '/^[+]V[0-9]\+$/d' > $inputA.ml.diff
else
  echo Not exact diff between A.ml and B.ml >&2
#  echo Using diff.loc >&2
  diff.loc -d  $inputA.ml $inputB.ml | \
    sed -e '/^[-]V[0-9]\+$/d' -e '/^[+]V[0-9]\+$/d' > $inputA.ml.diff || :
fi

if test -s $inputA.txt.diff ; then
  less -R $inputA.txt.diff
fi

if test -s $inputA.ml.diff ; then
  if test "$option" = 'exact' ; then
    less $inputA.ml.diff
  else
    rm.troff.space $inputA.ml.diff  | less
  fi
fi

cd $olddir
} # End of compare

#set -x

echo first file is $1
echo second file is $2
#echo Are in directory $PWD
if test -f $1 ; then
echo Comparing $1 with $2 >&2
  compare $1 $2 |& sed -f $HOME/bin/groff.err.weedout
else
  for new_file in $(find $2 -type f) ; do
    old_file=$1/$(echo "$new_file" | sed -e 's#'$2'##')
    echo oldfile=$old_file new_file=$new_file
    compare $old_file $new_file |& sed -f $HOME/bin/groff.err.weedout
  done
fi
#echo are in directory $PWD
-------------- next part --------------
  Trailing whitespace is so unnecessary, that its presence may be removed
before files containing it are distributed.

  Some programs have a tool to point out its presence, like

gcc

  with option "-Wtrailing-whitespace"

git
  with option "apply --whitespace=..."

  and in ".git/config"

[core]
	whitespace=...

grep

  with option -e '[[:blank:]]$'

less

  with command "/ $"

mandoc -T lint

  default action

###
 
For man pages

1) find most trailing spaces

#!/bin/sh
/bin/grep -n \
-e ' $' \
-e ' \\f.$' \
-e ' \\"' \
-e ' "$' -- $1

2) remove most trailing spaces

#!/usr/bin/sh
# remove "trailing space" in man pages.
# With option '-i', replace in place.
option=''

if test $# -eq 2; then
  if test $1 = '-i'; then
    option=$1
  else
    echo Only option = '-i' is usable
    exit 1
  fi
  shift
fi

sed -E $option -e 's/  *$//' -e 's/ \\f(.)$/\\f\1/' -e 's/ \\"/\\"/' \
-e 's/ "$/"/' $1
# Use the shell script "cmp.manuals <old.man> <new.man>" to check the
# outcome. 


More information about the Pkg-shadow-devel mailing list