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 path/to/target
.
Reading the note
Most programs play nicely with symlinks
. For instance, if you were to symlink your ~/.vimrc
to ~/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:
rm ~/.vimrc
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!