Learning new nix-craft is kinda like being handed shiny new electronics. You're instantly intrigued with what new stuff you can do with it. This entry is the first in a series about nix-craft.
I'm not sure when I first heard of symlinking, but the first time it hit me as "something I should get acquainted with" was while I was reading dotfiles.github.io. Context clues provided me with the idea that to symlink was to leave a little note to your OS about where you moved the file it expected to find there.
So, as I had endeavored to clean my virtual
$HOME of dotfiles, it became apparent that I needed to get familiar with symlinks.
Leaving a note
To create a symlink, you'd type this into your terminal:
ln -s path/to/target path/to/link
In English, this reads as:
Create a symlink at
path/to/link that redirects to
Reading the note
Most programs play nicely with
symlinks. For instance, if you were to symlink your
~/dotfiles/vim/.vimrc, Vim would access
~/.vimrc but would end up reading from
~/dotfiles/vim/.vimrc instead. It's kind of like a HTTP 302 that redirects you to another URI, or in our case, another path on your filesystem. Microsoft Windows users might find symlinks to be similar to shortcuts. They're essentially the same thing with the caveat that Windows programs would unfortunately get cranky if you tried to pass the shortcut file as an executable file. In *nix systems, symlinks in place of the actual file is okay for the most part!
It's also helpful to know what path your existing symlinks are pointing to. A simple
ls doesn't list out your symlinks. You'll want to run
ls -l, and symlinks will look something like the second entry below:
-rw------- 1 sitong staff 28054 Jun 29 17:52 .viminfo lrwxr-xr-x 1 sitong staff 33 Jun 29 16:57 .vimrc -> /Users/sitong/dotfiles/vim/.vimrc
I actually ran
ls -al since the symlinks in my
$HOME are all dotfiles.
Removing the note
Removing the symlink is just an
rm to the symlink. For instance:
A little bonus
So we saw that
ln -s is the command for symlinks but what if you passed a naked
ln command to your terminal?
You would actually be creating a hard link. Hard links point directly to a file's memory space instead of a filesystem path as with symlinks. This means you can move or rename the target file and the hard link will still resolve to that original target file. If you were to move or rename your symlinked target file then when some program tries to resolve the symlink, it won't find anything at that path. Try it out yourself!