diff mbox series

[6/6] fc: don't include the current fc in out-of-range last

Message ID d2d5de626bafa4e1b76eb136c1d63cb8f4ce7fa1.1675798292.git.nabijaczleweli@nabijaczleweli.xyz (mailing list archive)
State Accepted
Delegated to: Herbert Xu
Headers show
Series [1/6] fc -s: refuse multiple events instead of ignoring | expand

Commit Message

наб Feb. 7, 2023, 7:33 p.m. UTC
POSIX states:
  When a range of commands is used, it shall not be an error to specify
  first or last values that are not in the history list; fc shall
  substitute the value representing the oldest or newest command in the
  list, as appropriate. For example, if there are only ten commands in
  the history list, numbered 1 to 10:
    fc -l
    fc 1 99
  shall list and edit, respectively, all ten commands.

Which would seem to imply that the current fc shouldn't be included
(well, in the POSIX model, no non--l fc enters the history,
 so that reinforces that).

zsh, bash, mksh, yash all agree with this; oddly, ksh includes it.

Before:
  $ 1
  src/dash: 1: 1: not found
  $ 2
  src/dash: 2: 2: not found
  $ 3
  src/dash: 3: 3: not found
  $ 4
  src/dash: 4: 4: not found
  $ 5
  src/dash: 5: 5: not found
  $ 6
  src/dash: 6: 6: not found
  $ fc 1 999
  21
  ,p
  1
  2
  3
  4
  5
  6
  fc 1 999
After:
  $ fc 1 9999
  12
  ,p
  1
  2
  3
  4
  5
  6

Reported-by: Harald van Dijk <harald@gigawatt.nl>
Reported-in: https://marc.info/?l=dash&m=154707728009743&w=2
---
 src/histedit.c | 2 ++
 1 file changed, 2 insertions(+)
diff mbox series

Patch

diff --git a/src/histedit.c b/src/histedit.c
index 502ad40..7692776 100644
--- a/src/histedit.c
+++ b/src/histedit.c
@@ -476,6 +476,8 @@  str_to_event(const char *str, int last)
 				 */
 				retval = history(hist, &he,
 						last ? H_FIRST : H_LAST);
+				if (retval != -1 && last)
+					retval = history(hist, &he, H_NEXT);
 			}
 		}
 		if (retval == -1)