diff --git a/components/finsh/shell.c b/components/finsh/shell.c index 3a1b66fd3f605d88d12accef45b4c42c3eca462c..d9ec4f6839da2a4f043b060e3c090f6cd5ec6b18 100644 --- a/components/finsh/shell.c +++ b/components/finsh/shell.c @@ -372,26 +372,35 @@ static void shell_push_history(struct finsh_shell *shell) /* push history */ if (shell->history_count >= FINSH_HISTORY_LINES) { - /* move history */ - int index; - for (index = 0; index < FINSH_HISTORY_LINES - 1; index ++) + /* if current cmd is same as last cmd, don't push */ + if (memcmp(&shell->cmd_history[FINSH_HISTORY_LINES - 1], shell->line, shell->line_position)) { - memcpy(&shell->cmd_history[index][0], - &shell->cmd_history[index + 1][0], FINSH_CMD_SIZE); - } - memset(&shell->cmd_history[index][0], 0, FINSH_CMD_SIZE); - memcpy(&shell->cmd_history[index][0], shell->line, shell->line_position); + /* move history */ + int index; + for (index = 0; index < FINSH_HISTORY_LINES - 1; index ++) + { + memcpy(&shell->cmd_history[index][0], + &shell->cmd_history[index + 1][0], FINSH_CMD_SIZE); + } + memset(&shell->cmd_history[index][0], 0, FINSH_CMD_SIZE); + memcpy(&shell->cmd_history[index][0], shell->line, shell->line_position); - /* it's the maximum history */ - shell->history_count = FINSH_HISTORY_LINES; + /* it's the maximum history */ + shell->history_count = FINSH_HISTORY_LINES; + } } else { - memset(&shell->cmd_history[shell->history_count][0], 0, FINSH_CMD_SIZE); - memcpy(&shell->cmd_history[shell->history_count][0], shell->line, shell->line_position); + /* if current cmd is same as last cmd, don't push */ + if (shell->history_count == 0 || memcmp(&shell->cmd_history[shell->history_count - 1], shell->line, shell->line_position)) + { + shell->current_history = shell->history_count; + memset(&shell->cmd_history[shell->history_count][0], 0, FINSH_CMD_SIZE); + memcpy(&shell->cmd_history[shell->history_count][0], shell->line, shell->line_position); - /* increase count and set current history position */ - shell->history_count ++; + /* increase count and set current history position */ + shell->history_count ++; + } } } shell->current_history = shell->history_count;