Instantly share code, notes, and snippets.

Embed
What would you like to do?
Bash history with bash and git aliases expanded
"""
Outputs history with bash and git aliases expanded.
"""
from __future__ import print_function
import re
from subprocess import check_output
BASH_ALIASES = {}
for line in check_output('bash -i -c "alias -p"', shell=True).split('\n'):
if not line.strip():
continue
match = re.match(r"^alias (.+?)='(.+?)'\n*$", line)
BASH_ALIASES[match.group(1)] = match.group(2)
GIT_ALIASES = {}
for line in check_output('git config --get-regexp alias*', shell=True).split('\n'):
if not line.strip():
continue
match = re.match(r"^alias\.(.+?) (.+)$", line)
GIT_ALIASES[match.group(1)] = match.group(2)
def expand(cmd):
try:
number, cmd = cmd.strip().split(' ', 1)
cmd = cmd.strip()
except ValueError:
# empty line
return cmd
for alias, expansion in BASH_ALIASES.items():
cmd = re.sub(r"^" + re.escape(alias) + '(\s|$)', expansion + ' ', cmd)
for alias, expansion in GIT_ALIASES.items():
cmd = re.sub(r"^git " + re.escape(alias) + "(\s|$)", "git %s " % expansion, cmd)
return " %s %s" % (number, cmd)
if __name__ == "__main__":
for line in check_output('bash -i -c "history -r; history"', shell=True).split('\n'):
print(expand(line))
@pirate

This comment has been minimized.

Show comment
Hide comment
@pirate

pirate Dec 24, 2014

aww, I wish this worked for my fish functions as well :(

pirate commented Dec 24, 2014

aww, I wish this worked for my fish functions as well :(

@anowlcalledjosh

This comment has been minimized.

Show comment
Hide comment
@anowlcalledjosh

anowlcalledjosh Feb 2, 2018

if your shell prints anything on startup (e.g. in .bashrc or .profile), this won't work for you as-is – add the following after line 13 (match = re.match(r"^alias (.+?)='(.+?)'\n*$", line)) to fix:

if match is None: continue

anowlcalledjosh commented Feb 2, 2018

if your shell prints anything on startup (e.g. in .bashrc or .profile), this won't work for you as-is – add the following after line 13 (match = re.match(r"^alias (.+?)='(.+?)'\n*$", line)) to fix:

if match is None: continue
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment