0mp
goat
Shell

POSIX-compliant shell movement boosting hack for real ninjas (aka `cd x` and `cd ...`)

Last updated Jun 17, 2026
43
Stars
4
Forks
1
Issues
0
Stars/day
Attention Score
5
Language breakdown
No language data available.
โ–ธ Files click to expand
README

goat

Overview

I used to retrieve carefully-constructed cd commands from my history.
But then, I got a goat.
>
~ [Jonathan Paugh][jpaugh] on [Google+]
[ ~/Pictures ] $ goat dev ~/Documents/devel # create a link to the dev directory
[ ~/Pictures ] $ ls # see that there is no ~/Pictures/dev directory here
seahorses wallpapers
[ ~/Pictures ] $ cd dev # the goat framework's got you covered!
[ ~/Documents/devel ] $
Oh my! This is a POSIX-compliant shell movement boosting hack for
real ninjas.
#[posix\me\harder][posixmeharder] #[posixly\correct][posixlycorrect]
>
~ 0mp

Sometimes you jump around your filesystem tree a lot and you end up putting a couple of ugly aliases into your shell's rc file.

I should try it, even if it is dumb!
>
~ [dse] on [What the Daily WTF?] about goat v1.1.1

With goat you can easily manage your ninja shortcuts - just type goat p ~/Projects to introduce a new link and then cd p to jump to its destination.

Rad! I can do cd .... now instead of performing a horse galloping-like
waltz with ../ being my miserable dance floor. I'm cloning this goat
straight away!
>
~ YA0mp

BTW, Bash completion is now fully working with goat's shortcuts.

Building

$ make all

Installation

$ make install

Aferwards:

  • Make sure that ~/.local/bin is in your PATH:
$ cat <<'EOF' >> ~/.bashrc
  case "$PATH" in
      $HOME/.local/bin) ;;
      *) PATH="$HOME/.local/bin:$PATH" ;;
  esac
  EOF
  • Make sure that files inside ~/.local/etc/bash_completion.d are actually
sourced by the Bash completion library:
$ cat <<'EOF' >> ~/.bash_completion
  if [[ -d ~/.bash_completion.d ]]
  then
      for f in ~/.local/etc/bash_completion.d/*
      do
          [[ -f $f ]] && source "$f"
      done
  fi
  EOF

Usage overview

Create a shortcut named โ€œfโ€ to ~/Documents/dev/freebsd (no need to use
the link command explicitly here):

$ goat f ~/Documents/dev/freebsd

Follow a link to change a directory with cd(1):

$ cd f

Take the โ€œfโ€ shortcut and enter its destination subdirectory with just one command:

$ pwd /home/0mp $ cd f/ports $ pwd /usr/home/0mp/freebsd/ports

Create a shortcut named โ€œpโ€ to the current directory:

$ goat p .

Go up the filesystem tree with ... (same as the standard โ€œcd ../../โ€):

$ cd ...

List all your links:

$ goat list dots -> /usr/home/0mp/.dotfiles down -> /usr/home/0mp/Downloads f -> /usr/home/0mp/freebsd p -> /usr/home/0mp/freebsd/ports pa -> /usr/home/0mp/freebsd/patches src -> /usr/home/0mp/freebsd/svn/src svn -> /usr/home/0mp/freebsd/svn

Delete a link (or more):

$ goat delete f p

Delete all the links which point to directories with the given prefix:

$ goat deleteprefix "$HOME/Documents"

License

Licensed under 2-Clause BSD license. Copyright © 2016-2021 Mateusz Piotrowski

[posixmeharder]: http://wiki.wlug.org.nz/POSIXMEHARDER [posixlycorrect]: http://wiki.wlug.org.nz/POSIXLYCORRECT [dse]: https://what.thedailywtf.com/user/dse [What the Daily WTF?]: https://what.thedailywtf.com/topic/16122/quick-links-thread/2121 [Google+]: https://plus.google.com/113949504369826627206/posts/bqSfYTrQxLN [jpaugh]: https://github.com/jpaugh

๐Ÿ”— More in this category

ยฉ 2026 GitRepoTrend ยท 0mp/goat ยท Updated daily from GitHub