12

What setup do I need to use up-arrow to run previous command? With Mac, I can use up-arrow to rerun the command that I just run, but it doesn't seem to work with my bash shell.

I use 8.04 (I can't use the newest distribution because of some compiler version issues).

ADDED

I didn't change anything as it's a fresh install with VMWare Fusion on Mac.

2
  • 3
    In the default configuration, up arrow works perfectly: have you modified somethings?
    – enzotib
    Apr 11, 2011 at 16:15
  • as @enzotib says bash will do this by default, but some others, eg sh will not!
    – Rory Alsop
    Apr 11, 2011 at 19:13

5 Answers 5

14

Make sure you are actually using bash. A common gotcha is creating a new user with useradd instead of adduser or the Users and groups (GUI) application. With the former, the default shell set is /bin/sh. Run chsh (change shell) to make sure it's set to /bin/bash.

11

Make sure that your history is enabled. You can check the current status by running:

set -o

The output should contain (note the history on line):

histexpand      on
history         on
ignoreeof       off

If this is not enabled, you need to run set -o history. To make this change persistent, you need to append it to ~/.bashrc:

set -o history

If you want to run the previous command, you can run the next command as well:

!!

From Bash manual page:

Event Designators
   An event designator is a reference to a command line entry in the history list.

   !      Start a history substitution, except when followed by a blank, newline,
          carriage return, = or ( (when the extglob shell option  is
          enabled using the shopt builtin).
   !n     Refer to command line n.
   !-n    Refer to the current command line minus n.
   !!     Refer to the previous command.  This is a synonym for `!-1'.
   !string
          Refer to the most recent command starting with string.
   !?string[?]
          Refer to the most recent command containing string.  The trailing ? 
          may be omitted if string is followed immediately by a newline.
   ^string1^string2^
          Quick  substitution.  Repeat the last command, replacing string1 with
          string2.  Equivalent to ``!!:s/string1/string2/'' (see Modifiers below).
   !#     The entire command line typed so far.

If you're using Bash, you can use the default shortcuts for navigating through the history as well:

  • Ctrl + P: Previous command
  • Ctrl + N: Next command

    Commands for Manipulating the History previous-history (C-p) Fetch the previous command from the history list, moving back in the list. next-history (C-n) Fetch the next command from the history list, moving forward in the list.

4
  • 1
    I checked the setup is correct, but the up-arrow key doesn't work. However, I can use Ctrl-P/N for getting the same result. Thanks.
    – prosseek
    Apr 11, 2011 at 17:45
  • @prosseek In that case, have you changed /etc/inputrc or ~/.inputrc? Also, what escape sequence does the up and down arrow produce in the terminal you're using? To check, run cat, then on the empty line, hit uparrow and downarrow, then Ctrl+C to exit cat. Here it produces ^[[A^[[B.
    – geirha
    Apr 11, 2011 at 18:54
  • @geirha : I don't have the ~/.inputrc file, and I didn't change anything /etc/inputrc. And for the escape sequence, I got nothing seen in the screen.
    – prosseek
    Apr 11, 2011 at 21:06
  • @prosseek Then it sounds like the arrow keys never reach the terminal at all. Perhaps the VMWare interface is filtering them out or something.
    – geirha
    Apr 11, 2011 at 22:17
2

In terminal enter:

gedit  ~/.inputrc

Then copy paste and save:

"\e[A": history-search-backward
"\e[B": history-search-forward
"\e[C": forward-char
"\e[D": backward-char

From now on in terminal you can do incremental search, All you need to do to find a previous command is to enter say the first two or three letters and upward arrow will take you there quickly.

0

My solution is:

  • Edit /etc/inputrc like vi /etc/inputrc
  • Uncomment the following lines
#"\e[5~": history-search-backward
#"\e[6~": history-search-forward
  • And change them to
# Arrow Up
"\e[A": history-search-backward
# Arrow Down
"\e[B": history-search-forward
0

Had env var HISTSIZE defined with value -1.

unset HISTSIZE 

fixed it

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .