符号链接(symbolic link)
我很难理解符号链接(symbolic link)。我相信我理解基本前提,它本质上是一个别名。
但是,假设您让当前工作目录参与符号链接(symbolic link)的制作,那么它的工作原理是否取决于您所在的工作目录?
我当前使用的命令是ln -s
场景示例
我在 GitHub 上有一些项目,其中一些是我编写的简单小脚本,存储在 ~/bin 中。 ~/bin 位于我的 $PATH 环境变量中,以便轻松调用这些脚本:
$echo $PATH
/Users/me/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin
我刚刚注意到,在我安装的 git 中,它看起来像 /usr/local/git/bin
已附加到我的 $PATH 中。目前,我会假装这件事没有发生。
例如:
(hist
是一个简单的脚本,显示我最近使用的命令的统计信息)
#/bin/bash
history | awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl | head -n10
$hist
1 115 23% l
2 58 11.6% cd
3 44 8.8% ls
4 29 5.8% git
5 14 2.8% sudo
6 13 2.6% locate
7 12 2.4% open
8 11 2.2% wc
9 10 2% dt
10 9 1.8% rm
如果我执行此操作:
$cd ~/bin
$pwd
$/Users/me/bin
$ln -s hist ~/Desktop/hist
$ls -la ~/Desktop/
$ls -la | grep hist
lrwxr-xr-x 1 me staff 4 Sep 15 21:15 hist -> hist
$cd ~/Deskop
$hist
命令字,但 hist -> hist
的列表让我担心,它没有提供有关真正来源的信息。我不确定是否可以将文件移到其他地方并且它仍然可以工作。
所以我最近养成了在创建符号链接(symbolic link)时不使用任何扩展标记的习惯。意味着不再有 ~
之类的东西。
当我开始使用 GitHub 并创建我的 .bash_profile
、.bashrc
和 .bash_history< 时,我什至只需开始这样做
。每次我对 .bash_profile
进行更改,然后将其从本地存储库 cp
到 ~/bin
时,工作量都很大,然后运行 source ~/bin/.bash_profile
问题
使用 ln -s
执行此操作的正确过程是什么,或者纯粹是偏好问题,最终结果始终相同。
好消息是我了解了 ln
的 -F 标志,因此如果我点击作为目标的文件名,我将不再收到错误。 -F 标志将告诉 ln 覆盖它,从而节省了对文件进行 mv 操作然后运行 ln -s 命令的时间.
引用
这就是我的 ~/bin 现在的样子,为了简单起见,删除了许多内容:
$l
total 56
lrwxr-xr-x 1 me staff 53 Sep 15 20:40 hist -> /Users/me/Documents/me/git-projects/hist/hist
lrwxr-xr-x 1 me staff 57 Sep 15 20:41 lcaser -> /Users/me/Documents/me/git-projects/lcaser/lcaser
lrwxr-xr-x 1 me staff 70 Sep 10 05:12 mate -> /Applications/TextMate 1.x.app/Contents/SharedSupport/Support/bin/mate
lrwxr-xr-x 1 me staff 56 Sep 15 20:42 tart -> /Users/me/Documents/me/git-projects/tart/tart.sh
lrwxr-xr-x 1 me staff 69 Sep 15 20:44 watchinstall -> /Users/me/Documents/me/git-projects/watchInstall/watchInstall
最佳答案
考虑:
ln -s target linkname
仅当 target
由相对路径指定时,才会出现复杂情况。如果是,则该路径是相对于保存文件链接名称
的目录的。当前工作目录始终被忽略。
举个例子,考虑一下
ln -s hist ~/Desktop/hist
此命令在 ~/Desktop
中创建一个名为 hist
的链接。由于没有给出目标的路径,因此目标也被解释为位于目录 ~/Desktop
中。在本例中,这意味着链接 hist
指向其自身。
再举一个例子,考虑
cd /var/tmp
ln -s ../hist ~/Desktop/hist
这将创建从 ~/Desktop/hist
到 ~/hist
的链接,因为 ../
是相对于目录进行解释的包含链接~/Desktop
。执行ln
命令时所在的目录和访问/Desktop/hist
时所在的目录都是无关的。
另一个微妙之处
ln
并不关心发出命令时您使用的 target
内容:它可以是任意文本。 target
的值在尝试访问linkname
之前不会被解释。考虑:
$ ln -s "mary had a little lamb" ~/file1
$ ls -alt ~/file1
lrwxrwxrwx 1 user group 22 Sep 15 21:47 /home/user/file1 -> mary had a little lamb
$ cat ~/file1
cat: /home/user/file1: No such file or directory
如果我们愿意,我们可以稍后创建该文件:
$ echo this is a test >~/"mary had a little lamb"
$ cat ~/file1
this is a test
同样,只有在尝试访问链接时才会检查目标是否存在。
文档
此行为记录在 man ln
中:
Symbolic links can hold arbitrary text; if later resolved, a relative link is interpreted in relation to its parent directory.
关于git - 对于文件路径已满或缩短并依赖于 "token"扩展,创建符号链接(symbolic link)的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25860654/