Log
I have found a very easy way to keep logfiles of the commands that you executed in your shell to generate a certain annotation file for genome. It was inspired by a post on kuro5hin some time ago, Of course, makefiles are better than logfiles, but often you're just hacking around and don't want to bother with escaping those $s and tab-characters.
The people at UCSC keep their logfiles in an editor: "We write our shell commands in the makeDb/*.txt files first, then cut and paste those commands to the command line. If they are incorrect, they are corrected in the *.txt file, then cut and paste again to the command line until they work right. The *.txt file is open in an editor until a sequence of operations is completed. --Hiram"
I prefer my way as it saves me the copy-pasting. The following script allows you to write the last command to a logfile and later run selected commands from your log.
Add these three lines to your .bashrc:
export HISTIGNORE="logadd:log" alias logadd='history 1 | head -n 1 | cut -d" " -f4- >> log' alias logmenu=source ~/usr/bin/scripts/logmenu
(Please adjust the path ~/usr/bin/scripts here to the directory where you keep your scripts)
When you type logadd now, the last command you typed will be appended to a file called "log". So its a good habit to use logadd after you have found just the right combination of blat, pslSelect, overlapSelect and faPolyASizes, to be able to track down those nasty mistakes 6 months later.
Then save the following file under the name logmenu in the directory where you keep your scripts:
# this scripts needs alias logmenu=source ~/usr/bin/scripts/logmenu # in your bashrc otherwise the cmds will not find the way into your history #!/bin/bash if [ "$1" == "-h" -o -z $1 ]; then echo logmenu: display the file \"log\" as a menu and let the user choose a command to execute echo uses the program \"dialog\" fi echo -n dialog --menu logfile 24 70 18\ > /tmp/menu cat log | tr -d \' | gawk "{ ORS=\" \"; print NR, \"\'\" \$0 \"\'\" } " >> /tmp/menu . /tmp/menu 2> /tmp/menuresult line=`cat /tmp/menuresult` echo $line head -n $line log | tail -n 1 > /tmp/line history -r /tmp/line . /tmp/line rm -f /tmp/line /tmp/menuresult /tmp/menu
Now, when you type logmenu somewhere, a nice menu will pop up, you can select a command, which will then be run and also put into your history, so you can press the up-arrow-key, modify it, run it again, etc.