git - 对于文件路径已满或缩短并依赖于 "token"扩展,创建符号链接(symbolic link)的正确方法是什么

标签 git bash ln

符号链接(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/

相关文章:

regex - 使用 sed 在附加文本之前追加两个新行

linux - 是否可以在两个 perforce 存储库之间创建链接?

git - 如何在Windows上获得更快的SSH克隆速度?

linux - 将数据集从空格分隔转换为制表符分隔

linux - 如何将 ISO8859-15 转换为 UTF8?

linux - 使用 Bash,如何在不使用 'ln -s' 的情况下将文件列表输入 'find' ?

linux - 如何制作符号链接(symbolic link)但 cd 应显示物理目录名称

linux - 不包括顶级/父文件夹的 Git 克隆

linux - 补丁文件和差异文件之间的区别

git - 使用 gcloud 的凭证助手访问 Google 源代码库会阻止 osxkeychain 工作