diff options
| author | Denys Vlasenko <vda.linux@googlemail.com> | 2025-07-04 12:47:11 +0200 |
|---|---|---|
| committer | Denys Vlasenko <vda.linux@googlemail.com> | 2025-07-04 12:51:38 +0200 |
| commit | 8d3d0789172ab3f6580d04cd4bbafaef5e108ac7 (patch) | |
| tree | 797769b90f9afa8974db8943fbd48d023e94115d | |
| parent | 9c46a0688576dd8c67d2fc24b68c07402da14fc8 (diff) | |
| download | busybox-w32-8d3d0789172ab3f6580d04cd4bbafaef5e108ac7.tar.gz busybox-w32-8d3d0789172ab3f6580d04cd4bbafaef5e108ac7.tar.bz2 busybox-w32-8d3d0789172ab3f6580d04cd4bbafaef5e108ac7.zip | |
shell: empty HISTFILE disables history saving, just as unset one did
The rationale here is that unsetting HISTFILE in /etc/profile
does not "stick": if it's unset, the default one is set later
(after /etc/profile is executed) by the shell.
But setting (and exporting, so it is inherited by all
(grand)child shells) an empty one works.
function old new delta
save_history 296 316 +20
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| -rw-r--r-- | libbb/lineedit.c | 6 | ||||
| -rw-r--r-- | shell/ash.c | 2 | ||||
| -rw-r--r-- | shell/hush.c | 2 |
3 files changed, 6 insertions, 4 deletions
diff --git a/libbb/lineedit.c b/libbb/lineedit.c index fe0dbc5b8..43d1da35c 100644 --- a/libbb/lineedit.c +++ b/libbb/lineedit.c | |||
| @@ -1563,7 +1563,8 @@ void FAST_FUNC save_history(line_input_t *st) | |||
| 1563 | { | 1563 | { |
| 1564 | FILE *fp; | 1564 | FILE *fp; |
| 1565 | 1565 | ||
| 1566 | if (!st || !st->hist_file) | 1566 | /* bash compat: HISTFILE="" disables history saving */ |
| 1567 | if (!st || !st->hist_file || !state->hist_file[0]) | ||
| 1567 | return; | 1568 | return; |
| 1568 | if (st->cnt_history <= st->cnt_history_in_file) | 1569 | if (st->cnt_history <= st->cnt_history_in_file) |
| 1569 | return; /* no new entries were added */ | 1570 | return; /* no new entries were added */ |
| @@ -1617,7 +1618,8 @@ static void save_history(char *str) | |||
| 1617 | int fd; | 1618 | int fd; |
| 1618 | int len, len2; | 1619 | int len, len2; |
| 1619 | 1620 | ||
| 1620 | if (!state->hist_file) | 1621 | /* bash compat: HISTFILE="" disables history saving */ |
| 1622 | if (!state->hist_file || !state->hist_file[0]) | ||
| 1621 | return; | 1623 | return; |
| 1622 | 1624 | ||
| 1623 | fd = open(state->hist_file, O_WRONLY | O_CREAT | O_APPEND, 0600); | 1625 | fd = open(state->hist_file, O_WRONLY | O_CREAT | O_APPEND, 0600); |
diff --git a/shell/ash.c b/shell/ash.c index 18344767a..1a85eec71 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
| @@ -14540,7 +14540,7 @@ exitshell(void) | |||
| 14540 | /* HISTFILE: "If unset, the command history is not saved when a shell exits." */ | 14540 | /* HISTFILE: "If unset, the command history is not saved when a shell exits." */ |
| 14541 | hp = lookupvar("HISTFILE"); | 14541 | hp = lookupvar("HISTFILE"); |
| 14542 | line_input_state->hist_file = hp; | 14542 | line_input_state->hist_file = hp; |
| 14543 | save_history(line_input_state); /* no-op if hist_file is NULL */ | 14543 | save_history(line_input_state); /* no-op if hist_file is NULL or "" */ |
| 14544 | } | 14544 | } |
| 14545 | #endif | 14545 | #endif |
| 14546 | 14546 | ||
diff --git a/shell/hush.c b/shell/hush.c index 68aca53a3..0b2bc01f5 100644 --- a/shell/hush.c +++ b/shell/hush.c | |||
| @@ -2120,7 +2120,7 @@ static void hush_exit(int exitcode) | |||
| 2120 | /* HISTFILE: "If unset, the command history is not saved when a shell exits." */ | 2120 | /* HISTFILE: "If unset, the command history is not saved when a shell exits." */ |
| 2121 | hp = get_local_var_value("HISTFILE"); | 2121 | hp = get_local_var_value("HISTFILE"); |
| 2122 | G.line_input_state->hist_file = hp; | 2122 | G.line_input_state->hist_file = hp; |
| 2123 | save_history(G.line_input_state); /* no-op if hist_file is NULL */ | 2123 | save_history(G.line_input_state); /* no-op if hist_file is NULL or "" */ |
| 2124 | } | 2124 | } |
| 2125 | #endif | 2125 | #endif |
| 2126 | 2126 | ||
