On 2/13/19 3:47 PM, Айрат Васбикарамов wrote:
Sorry it took a while to respond; this message ended up in my spam folder
for some reason.
> Thanks for clarification. But I still consider this behavior inconsistent.
>
> 1) Why we need to check that history_lines_this_session is less than
> history_offset? history_lines_this_session always stores number of lines in
> this session. So we can just append this much lines.
If you're at the end of the history, history_offset is the index of the
last entry in the history list. You can't just append
history_lines_this_session; there aren't that many entries in the history
list. You don't really have to worry about this; append_history already
takes care of it.
>
> 2) Let me rewrite what happens in preceding example. We can set $HISTSIZE
> which we prefer (for example in bashrc). Then we start new session. And it's
> happened that we type more than $HISTSIZE commands. Then if I type "history
> -a", I expect that $HISTSIZE commands will be appended to history file
> (leading commands will disappear, as our buffer can't hold this much
> commands). But actually nothing will be added!
OK. So in this case, it doesn't append anything. I think it violates one of
the assumptions in place when the code was written (1990!). The interesting
thing is that if you type only one more command before running `history -a'
again, it will "work", since maybe_append_history() resets the value of
history_lines_this_session to 0 no matter what.
I don't think this would happen too much in practice, though, because if
you wait until you have more than $HISTSIZE history entries, you'll lose
information no matter what you use.
It seems like what you want is min(history_lines_this_session, history_offset),
kind of like what you say below. Try the attached patch and see if it
does what you want.
>
> 3) Actually this behavior already present in code if histappend option is set.
> bashhist.c maybe_save_shell_history()
> ...
> if (history_lines_this_session <= where_history () || force_append_history)
> ...
> So if we say to append history at exit it doesn't bother to check that
> history_lines_this_session is less than offset. It just save
> min(history_lines_this_session, HISTSIZE) to history file. So it's not clear
> why when we explicitly tell to append history behavior is "weaker" than when
> we set histappend option.
The `histappend' option explicitly doesn't care about duplicates, so it
never cared about trying to figure out the history entries that hadn't
been read from the history file.
Chet
--
``The lyf so short, the craft so long to lerne.'' - Chaucer
``Ars longa, vita brevis'' - Hippocrates
Chet Ramey, UTech, CWRUc...@case.eduhttp://tiswww.cwru.edu/~chet/
*** ../bash-5.0-patched/bashhist.c 2018-07-05 22:41:14.0 -0400
--- bashhist.c 2019-02-23 17:12:02.0 -0500
***
*** 437,445
char *filename;
{
! int fd, result;
struct stat buf;
result = EXECUTION_SUCCESS;
! if (history_lines_this_session > 0 && (history_lines_this_session <=
where_history ()))
{
/* If the filename was supplied, then create it if necessary. */
--- 437,445
char *filename;
{
! int fd, result, histlen;
struct stat buf;
result = EXECUTION_SUCCESS;
! if (history_lines_this_session > 0)
{
/* If the filename was supplied, then create it if necessary. */
***
*** 454,457
--- 454,461
close (fd);
}
+ /* cap the number of lines we write at the length of the history list */
+ histlen = where_history ();
+ if (histlen > 0 && history_lines_this_session > histlen)
+ history_lines_this_session = histlen; /* reset below anyway */
result = append_history (history_lines_this_session, filename);
/* Pretend we already read these lines from the file because we just