View Issue Details

IDProjectCategoryView StatusLast Update
00004071003.1(2008)/Issue 7Shell and Utilitiespublic2024-06-11 08:53
Reportereblake Assigned Toajosey  
PrioritynormalSeverityObjectionTypeEnhancement Request
Status ClosedResolutionAccepted As Marked 
NameEric Blake
OrganizationRed Hat
User Referenceebb.head
Sectionhead
Page Number2791
Line Number91030
Interp Status---
Final Accepted Text0000407:0000752
Summary0000407: add head -c
DescriptionThe rationale for head states (XCU line 91101):

There is no −c option (as there is in tail) because it is not historical
practice and because other utilities in this volume of POSIX.1-2008
provide similar functionality.

but does not name what those other utilities might be. The only one I
can think of is dd; however, while dd can indeed truncate input after a
particular number of bytes, it requires the use of ibs=1 which results
in rather inefficient operation. This is tracked separately as
0000406

Both GNU and BSD implementations of head support -c with much more
efficient operation than dd, and the ability to truncate input after
an arbitrary number of bytes seems useful enough to standardize for
Issue 8.
Desired ActionAt line 91030 [XCU head SYNOPSIS], change:

head [−n number] [file...]

to:

head [-c number|−n number] [file...]

At line 91034 [head DESCRIPTION], change:

Copying shall end at the point in each input file indicated by the −n
number option. The option-argument number shall be counted in units of
lines.

to:

Copying shall end at the point in the file indicated by the −c number or
−n number options. The option-argument number shall be counted in units
of lines or bytes, according to the options −n and −c. Both line and byte
counts start from 1.

At line 91039 [head OPTIONS], change:

−n number The first number lines of each input file shall be copied to
standard output. The application shall ensure that the number
option-argument is a positive decimal integer.

When a file contains less than number lines, it shall be copied to
standard output in its entirety.

to:

−c number The first number bytes of each input file shall be copied to
standard output. The application shall ensure that the number
option-argument is a positive decimal integer.

−n number This option shall be equivalent to −c number, except the ending
location in the file shall be measured in lines instead of bytes.

When a file contains less than number bytes or lines, it shall be copied
to standard output in its entirety.

At line 91054 [head INPUT FILES], change:

Input files shall be text files, but the line length is not restricted to
{LINE_MAX} bytes.

to:

If the −c option is specified, the input files can contain arbitrary data; otherwise, the input files shall be text files, but the line length is
not restricted to {LINE_MAX} bytes.

At line 91101 [head RATIONALE], change:

There is no −c option (as there is in tail) because it is not historical
practice and because other utilities in this volume of POSIX.1-2008
provide similar functionality.

to:

Head and tail have not historically been symmetric. For example, this
standard only requires tail to support at most one file operand, while
head must operate on multiple files. Conversely, this standard requires
tail to be able to start at a position relative to the start of a file,
but head need not support stopping at a position relative to the end of
the file. Implementations may make the choose to make head and tail
symmetric as an extension, but applications should not rely on this.

Older implementations of head did not support -c number, but emulating
this via dd ibs=1 count=number is less efficient.
Tagsissue8

Relationships

related to 0000406 Closedajosey add dd iflags=fullblock, for better pipe interaction 

Activities

geoffclare

2011-04-16 10:49

manager   bugnote:0000743

I would suggest a slight change to the end of the proposed rationale
addition, to acknowledge the alternative solution of two piped dd
processes (in cases where the number of bytes is a convenient multiple):

Older implementations of head did not support -c number, but emulating
this via dd ibs=1 count=number is much less efficient and emulating
via dd obs=pipe_buf | dd ibs=size count=number_of_blocks is cumbersome,
somewhat less efficient, and can only be used if the number of bytes
to be copied is a multiple of a suitable block size less than or equal
to PIPE_BUF.

msbrown

2011-04-21 16:15

manager   bugnote:0000752

Take Desired Action as modified by 0000407:0000743

Issue History

Date Modified Username Field Change
2011-04-14 23:36 eblake New Issue
2011-04-14 23:36 eblake Status New => Under Review
2011-04-14 23:36 eblake Assigned To => ajosey
2011-04-14 23:36 eblake Name => Eric Blake
2011-04-14 23:36 eblake Organization => Red Hat
2011-04-14 23:36 eblake User Reference => ebb.head
2011-04-14 23:36 eblake Section => head
2011-04-14 23:36 eblake Page Number => 2791
2011-04-14 23:36 eblake Line Number => 91030
2011-04-14 23:36 eblake Interp Status => ---
2011-04-16 10:49 geoffclare Note Added: 0000743
2011-04-21 16:13 msbrown Tag Attached: issue8
2011-04-21 16:15 msbrown Note Added: 0000752
2011-04-21 16:15 msbrown Status Under Review => Resolved
2011-04-21 16:15 msbrown Resolution Open => Accepted As Marked
2011-04-21 16:15 msbrown Final Accepted Text => 0000407:0000752
2011-04-28 16:52 eblake Relationship added related to 0000406
2020-03-03 14:43 geoffclare Status Resolved => Applied
2024-06-11 08:53 agadmin Status Applied => Closed