f()

July 10, 2008

linux

You all, of course, know about the fc command. From bash’s help system:

fc: fc [-e ename] [-nlr] [first] [last] or fc -s [pat=rep] [cmd]

fc is used to list or edit and re-execute commands from the history list. FIRST and LAST can be numbers specifying the range, or FIRST can be a string, which means the most recent command beginning with that string.

Now I had the following problem: you have a file with shell commands in it. Next you want to select a few lines from this file to be executed in your running shell. A way to do this is:

  • edit the file with vi
  • save this edited file under a different name, say $file
  • execute it: . $file

But this is cumbersome and I wanted the executed lines to be added to my shell’s history. So that is why I created the function: f():

  • edit a file, exec what’s left
  • you are finished editing
  • add what is executed to the history (fc -R)

It needs to be a shell function, because as an external executable you cannot alter your current shell history.

Synopsis: f filename

This is the body of the function:

f() {
if [[ ! -f $1 ]]; then return 1; fi

copy=$(mktemp ${TMPPREFIX:-/tmp/shell}.XXXXXXX)
if cp $1 $copy; then
    if ${EDTIOR:-vi} $copy; then
    $SHELL $copy
    # add to hist
    fc -R ${copy}
    rm -f $copy
    fi
   else
    return 1
fi
}

How does it work?

  • Check if we have an argument
  • If so, copy the file to a temporary file
  • Edit this temporary file
  • Execute the contents when the editor did a normal exit
  • Add the results to the current history (fc -R)
  • Remove the temporary file
Zsh