Chet Ramey <chet.ra...@case.edu> writes:
> It fails because the history library requires the file to be a regular
> file. It tries to read and write atomically, so the read history function
> gets the size of the history file, allocates one big buffer to hold it,
> and reads it in one go.

Though in regard to the command "history -r file", the documentation is
rather treacherous.  At first glance, and from the description of the -r
option, it seems to be just a file from which some stuff is read:

              -r     Read the contents of the history file and append them  to
                     the current history list.

The key is the line buried in the preceding paragraph "If filename is
supplied, it is used as the name of the history  file".

And really, that means that the effect of -r is kind of complicated and
unintuitive.  The prior contents of the file are read, appended to "the
current history list", which I assume is the in-memory history, but
there seems to be an implication that all of the current history will
then (eventually) be written to the file, *prepending* the prior
in-memory history to the prior contents of the file.

And since the crucial line only applies to a subset of the history
forms, it might be clearer to split off the -anrw group with their own
header to point out the complication.  E.g.

       history [n]
       history -c
       history -d offset
       history -d start-end
       history -p arg [arg ...]
       history -s arg [arg ...]
              With no options, display the command history list with line num‐
              bers.  Lines listed with a * have been modified.  An argument of
              n  lists only the last n lines.  If the shell variable HISTTIME‐
              FORMAT is set and not null, it is used as a  format  string  for
              strftime(3)  to display the time stamp associated with each dis‐
              played history entry.  No intervening blank is  printed  between
              the  formatted  time stamp and the history line.  Options,
              if supplied, have the following meanings:
              -c     Clear the history list by deleting all the entries.
              -d offset
                     Delete the history entry at position offset.   If  offset
                     is negative, it is interpreted as relative to one greater
                     than the last history position, so negative indices count
                     back  from  the  end  of  the history, and an index of -1
                     refers to the current history -d command.
              -d start-end
                     Delete the history entries between  positions  start  and
                     end,  inclusive.   Positive and negative values for start
                     and end are interpreted as described above.
              -p     Perform history substitution on the  following  args  and
                     display  the  result  on  the  standard output.  Does not
                     store the results in the history list.  Each arg must  be
                     quoted to disable normal history expansion.
              -s     Store  the  args  in  the history list as a single entry.
                     The last command in the history list  is  removed  before
                     the args are added.

       history -anrw [filename]
              If filename is supplied, it is used as the name of the
              history file; if not, the value of HISTFILE is used.
              -a     Append the ``new'' history lines  to  the  history  file.
                     These  are  history  lines entered since the beginning of
                     the current bash session, but not already appended to the
                     history file.
              -n     Read  the history lines not already read from the history
                     file into the current history list.  These are lines  ap‐
                     pended  to  the  history  file since the beginning of the
                     current bash session.
              -r     Read the contents of the history file and append them  to
                     the current history list.
              -w     Write the current history list to the history file, over‐
                     writing the history file's contents.

              If  the  HISTTIMEFORMAT variable is set, the time stamp informa‐
              tion associated with each history entry is written to  the  his‐
              tory  file, marked with the history comment character.  When the
              history file is read, lines beginning with the  history  comment
              character  followed  immediately  by  a digit are interpreted as
              timestamps for the following history entry.  The return value is
              0 unless an invalid option is encountered, an error occurs while
              reading or writing the history file, an invalid offset  is  sup‐
              plied as an argument to -d, or the history expansion supplied as
              an argument to -p fails.

Dale

Reply via email to