Skip to main content

Rash Advances Shell History

Project description

What is this?

Shell history is useful. But it can be more useful if it logs more data points. For example, if you forget which make target to run for certain project, you’d want to search shell commands that are ran in particular directory. Wouldn’t it be nice if you can do this?:

rash search --cwd . "make*"

RASH records many data points and they are stored in SQLite database. Here is a list of recorded information [1].

  1. Current directory ($PWD).

  2. Exit code ($?)

  3. Exit code of pipes ($PIPESTATUS / $pipestatus)

  4. The time command is started and terminated.

  5. Environment variable ($PATH, $SHELL, $TERM, $HOST, etc.)

  6. Real terminal. $TERM is used to fake programs. RASH can detect if you are in tmux, byobu, screen, gnome-terminal, etc.

  7. Session information. If you go back and forth in some terminals, RASH does not loose in which sequence you ran the commands in which terminal.

Install

RASH is written in Python. The easiest way to install is to use pip (or easy_install, if you wish). You may need sudo for installing it in a system directory.:

pip install rash

RASH tested against Python 2.6, 2.7 and 3.2. However, as watchdog does not work with Python 3, you can’t get full power of RASH with Python 3.

If you want to use developmental version, just clone the git repository and add the following in your RC file.:

alias rash="PATH/TO/RASH/rash_cli.py"

Setup

Add this to your .zshrc or .bashrc. That’s all.:

eval "$(rash init)"

For more information, see rash init --help.

Usage

Showing detailed information – rash show

If you give --with-command-id to rash search command, it prints out ID number for each command history.:

% rash search --with-command-id --limit 5 "*git*"
 359  git log
1253  git help clone
1677  git help diff
1678  git diff --word-diff
1780  git merge

You can see all information associated with a command with rash show command:

rash show 1677

Interactive search – rash isearch (experimental!)

Searching history using command line is not fast. You can use rash isearch command to interactively search history and see the result immediately as you type.

You need percol to use this feature.

Zsh user can setup a keybind like this:

# Type `Ctrl-x r` to start isearch
bindkey "^Xr" rash-zle-isearch

Defining this function in your rc file can be handy and it is usable for bash users.:

rash-isearch(){
  eval "$(rash isearch)"
}

Tips

rash-testlike and rash-zle-testlike commands defined as the following can find test-like commands you entered in the current directory. In the later version I am planning to support this more cleanly in RASH configuration. Add the following in your shell RC file until then.:

MY_RASH_TEST_LIKE=(
    -fff  # show session/command IDs and command count
    --exclude-pattern "*rash *"  # don't include rash commands
    --exclude-pattern "*rash-*"
    --include-pattern "*test*"
    --include-pattern "tox*"
    --include-pattern "make *test*"
    --include-pattern "make *travis*"
    --include-pattern "* make *test*"   # to match "ENV=VALUE make test"
    --include-pattern "* make *travis*"
    --include-exit-code 0  # exclude failed command
)

rash-testlike(){
    rash search --cwd . "${MY_RASH_TEST_LIKE[@]}" "$@"
}

rash-zle-testlike(){
    # Options after "--" are used when searching but cannot be
    # changed in the interactive search UI.  The option passed
    # by --query can be modified in the UI.
    BUFFER=$(rash isearch --query "--cwd . " -- "${MY_RASH_TEST_LIKE[@]}")
    CURSOR=$#BUFFER
    zle -R -c
}
zle -N rash-zle-testlike

Dependency

Python modules:

Platforms

UNIX-like systems

RASH is tested in Linux and I am using in Linux. It should work in other UNIX-like systems like BSD.

Mac OS

I guess it works. Not tested.

MS Windows

Probably no one wants to use a shell tool in windows, but I try to avoid stuff that is platform specific. Only the daemon launcher will not work on Windows but there is several ways to avoid using it. See rash init --help.

Design principle

RASH’s design is focused on sparseness. There are several stages of data transformation until you see the search result, and they are done by separated processes.

First, rash record command dumps shell history in raw JSON record. This part of program does not touches to DB to make process very fast. As there is no complex transformation in this command, probably in the future version it is better to rewrite it entirely in shell function.

Second, rash daemon runs in background and watches the directory to store JSON record. When JSON record arrives, it insert the data into database.

rash record and rash daemon are setup by simple shell snippet eval $(rash init).

Finally, you can search through command history using search interface such as rash search. This search is very fast as you don’t read all JSON records in separated files.

+-------+         +--------+         +--------+         +--------+
| Shell |         | Raw    |         | SQLite |         | Search |
| hooks |-------->| JSON   |-------->|   DB   |-------->| result |
+-------+         | record |         +--------+         +--------+
                  +--------+

        `rash record`      `rash daemon`      `rash search`
                                               `rash show`

        \------------------------------/      \------------/
           `rash init` setups them           search interface

License

RASH is licensed under GPL v3. See COPYING for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

rash-0.1.1.tar.gz (38.6 kB view details)

Uploaded Source

File details

Details for the file rash-0.1.1.tar.gz.

File metadata

  • Download URL: rash-0.1.1.tar.gz
  • Upload date:
  • Size: 38.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for rash-0.1.1.tar.gz
Algorithm Hash digest
SHA256 776962d06937370b2cb7706b12a2fd24817e71e3fc78ac8d655a4a0004f9e02a
MD5 8c14719b087a3f6533e5591f348af462
BLAKE2b-256 d351ff9b97436b18f36db6052b48d963930cd1858b3a20f2346ecf8374c6eb4e

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page