Last active
May 30, 2016 01:14
-
-
Save volomike/2cb6a4b01c3445dd8bd4f7d1603d4dd9 to your computer and use it in GitHub Desktop.
xyzzy - Great system admin command for Bash for switching between directories
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
i="$1" | |
i=$((${i//[^0-9]/})) | |
i="$(($i-1+0))" | |
b="$2" | |
b=$((${b//[^0-9]/})) | |
b="$(($b-1+0))" | |
if [ -z "$XYZZY_INDEX" ]; then | |
XYZZY_INDEX="$((-1))" | |
fi | |
if [ ! -f "/tmp/xyzzy.list" ]; then | |
touch /tmp/xyzzy.list | |
chmod a+rw /tmp/xyzzy.list | |
fi | |
readarray -t MYLIST < /tmp/xyzzy.list | |
showHelp(){ | |
read -r -d '' MYHELP <<'EOB' | |
xyzzy 1.0 | |
A command for manipulating escape routes from grues. Otherwise known as a useful system admin | |
tool for storing current directories and cycling through them rapidly. You'll wonder why this | |
wasn't created many moons ago. | |
Usage: xyzzy [options] | |
help/-h/--help Show the help. | |
this/-t/--this Store the current directory in /tmp/xyzzy.list | |
begone/-b/--begone Clear the /tmp/xyzzy.list file. However, succeed with a number and | |
it clears just that item from the stored list. | |
show/-s/--show Show the list of stored directories from /tmp/xyzzy.list | |
. # Use a number to 'cd' to that directory item in the stored list. This syntax is odd: | |
. xyzzy 2 | |
...would change to the second directory in the list | |
. [no options] Use the command alone and it cd cycles through the next item in the stored | |
list, repeating to the top when it gets to the bottom. The dot and space before xyzzy | |
is required in order for the command to run in the current shell and not a subshell: | |
. xyzzy | |
Note that you can avoid the odd dot syntax by adding this to your ~/.bashrc file: | |
alias xyzzy=". xyzzy" | |
and then you can do "xyzzy" to cycle through directories, or "xyzzy {number}" to go to a | |
specific one. | |
May you never encounter another grue. | |
Copyright (c) 2016, Mike McKee <https://github.com/volomike> | |
EOB | |
echo -e "$MYHELP\n" | |
} | |
storeThis(){ | |
echo -e "With a stroke of your wand, you magically created the new escape route: $PWD" | |
echo "$PWD" >> /tmp/xyzzy.list | |
chmod a+rw /tmp/xyzzy.list | |
} | |
begoneList(){ | |
if [[ "$b" == "-1" ]]; then | |
echo "POOF! Your escape routes are gone. We bless your soul from the ever-present grues!" | |
>/tmp/xyzzy.list | |
chmod a+rw /tmp/xyzzy.list | |
else | |
echo -n "Waving your wand in the dark, you successfully manage to remove one of your escape routes: " | |
echo "${MYLIST[${b}]}" | |
>/tmp/xyzzy.list | |
chmod a+rw /tmp/xyzzy.list | |
for x in "${MYLIST[@]}"; do | |
if [[ ! "$x" == "${MYLIST[${b}]}" ]]; then | |
echo "$x" >> /tmp/xyzzy.list | |
fi | |
done | |
fi | |
} | |
showList(){ | |
echo -e "These are your escape routes:\n" | |
cat /tmp/xyzzy.list | |
} | |
cycleNext(){ | |
MAXLINES=${#MYLIST[@]} | |
XYZZY_INDEX=$((XYZZY_INDEX+1)) | |
if [[ $XYZZY_INDEX > $(($MAXLINES - 1)) ]]; then | |
XYZZY_INDEX=0 | |
fi | |
MYLINE="${MYLIST[${XYZZY_INDEX}]}" | |
cd "$MYLINE"; | |
} | |
switchDir(){ | |
MYLINE="${MYLIST[${i}]}" | |
cd "$MYLINE"; | |
} | |
if [[ "$@" == "" ]]; | |
then | |
cycleNext | |
fi; | |
while [[ "$@" > 0 ]]; do case $1 in | |
help) showHelp;; | |
--help) showHelp;; | |
-h) showHelp;; | |
show) showList;; | |
-s) showList;; | |
--show) showList;; | |
list) showList;; | |
this) storeThis;; | |
--this) storeThis;; | |
-t) storeThis;; | |
begone) begoneList;; | |
--begone) begoneList;; | |
*) switchDir;; | |
esac; shift | |
done | |
export XYZZY_INDEX |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
The way I use this is to copy into /usr/bin folder and then chmod a+x on it. Then, I edit my root and user account ~/.bashrc file to include these lines at the bottom:
The 'xy' is a shortened form of the command for faster typing.
Then, I can store the current directory in the list with...
xyzzy this
...and repeat as necessary.
Once I fill this list with the directories I need, they remain there until I reboot the computer because that's when /tmp is cleared out again. I can then type...
xyzzy show
...to list the currently saved directories. In order to switch to a directory, I have two choices. One option is to specify the path by index (and it's a 1-based index) like so:
xyzzy 2
...which would switch to the directory that's the second item in the list. Or, I could leave off the index number and just do:
xyzzy
...to have it loop through each directory as I need. For more commands you can do, type:
xyzzy help
Of course, work is more fun with the silly echo statements that I added in.
Note that xyzzy is a reference to the Collosal Cave text adventure, where typing xyzzy would let you switch between two rooms in the game in order to avoid grues.