When I first used
ln, I expected the behavior of
ln source link to work. But
ln is slightly more complicated than that. While learning it from the beginning, I discovered it does not always resolve the path correctly; additionally, it doesn’t not error if the source is non-existence. I discovered that this was necessary because
ln is designed to be versatile. So I understood that one would want links at times to be created that don’t exist yet, but it was unhelpful to me in the way that I felt
ln should logically work, and the way that I wanted to use it.
Originally, I would do a link like this and it would be broken:
# ln -s ../dir/file dir/
I’ve attempted other links since then that too (of which I can’t remember now) would also be broken. So the way I discovered to do links correctly without doubt was to use whats called the fully-qualified or absolute path (i.e. a path defined from root [
# ln -s /home/username/Document/file /home/username/Desktop/file
There’s a program called
realpath that does this, so I wrote a wrapper script for it and it turned out to be pretty easy. The script resolves the absolute paths, verifies the existence of the source directory and link parent directory, and detects write permissions prompting sudo when needed. It works like this:
# lnk ~/Documents/Resumes/ ~/Desktop ‘/home/username/Documents/Resumes’ -> ‘/home/username/Desktop/Resumes’
# lnk ~/Documents/Resumes/ ~/Desktop/Resumes-I-like ‘/home/username/Documents/Resumes’ -> ‘/home/username/Desktop/Resumes-I-like’
a specifically named link will be put on the Desktop.
# lnk /etc/fstab ~ # or use ~/fstab-edit ‘/etc/fstab’ -> ‘/home/todd/fstab’
If trying to link to a write-protected directory:
# lnk /usr/share/vim/vim73/vimrc_example.vim /etc/vimrc [sudo] password for $USER: ‘/usr/share/vim/vim73/vimrc_example.vim’ -> ‘/etc/vimrc’
An error message will appear if the source or link parent directory doesn’t exist:
* The script will work for just about any instance with the exception of removable media where relative-paths would be better used.