我想做的事情应该很简单。但就是不行。
我有一个包含点文件的存储库。我希望能够将此存储库克隆到系统中的任何地方,并且只获取一个文件。然后,我希望该文件根据需要使用相对路径获取其他文件。因为我不想强迫您将此存储库克隆到某个特定位置并硬编码我的所有路径。我希望这是合理的。
因此,我的 repo 有这个简单的文件结构
.dot-files/
├─ bash/
│ ├─ default-config
│ ├─ .bunch_of_dot_files
├─ zsh/
│ ├─ default-config
│ ├─ .bunch_of_dot_files
然后我希望我的默认配置能够获取这些点文件,无论它们看起来如何。今天,它们位于同一个文件夹中。明天它们可能位于不同的子文件夹中,我不知道。
并且有一个硬性要求,即发起者.bashrc
或.zshrc
不.whateverRC
知道此存储库的结构。他们应该只提供配置,而不需要其他任何东西。
但是,为了论证的目的,下面列出目前的完整情况:
中山大学
$ cd ~/.dot-files/zsh/
$ ls -la
drwxr-xr-x 7 me staff 224 May 8 13:33 .
drwxr-xr-x 7 me staff 224 May 8 13:00 ..
-rw-r--r-- 1 me staff 1423 May 8 12:32 .alias
-rw-r--r-- 1 me staff 18582 May 8 12:32 .git-prompt.sh
-rw-r--r-- 1 me staff 2059 May 8 12:32 .prompt
-rw-r--r-- 1 me staff 926 May 8 14:01 .zsh-git-info
-rw-r--r-- 1 me staff 143 May 8 15:02 default-config
$ cat ~/.zshrc
source ~/.dot-files/zsh/default-config
$ cat ~/.dot-files/zsh/default-config
source "$(dirname "$0")/.alias"
source "$(dirname "$0")/.prompt"
source "$(dirname "$0")/.zsh-git-info"
source "$(dirname "$0")/.git-prompt.sh"
这确实有效,完美。
重击
$ cd ~/.dot-files/bash/
$ ls -la
drwxr-xr-x 8 me staff 256 May 8 13:28 .
drwxr-xr-x 7 me staff 224 May 8 13:00 ..
-rw-r--r-- 1 me staff 1791 May 8 13:08 .alias
-rw-r--r-- 1 me staff 79837 Apr 12 2022 .git-completion.bash
-rw-r--r-- 1 me staff 1602 May 8 13:49 .git-prompt
-rw-r--r-- 1 me staff 1816 May 8 13:06 .ps1
-rw-r--r-- 1 me staff 877 May 8 13:09 .utils
-rw-r--r-- 1 me staff 142 May 8 15:20 default-config
$ cat ~/.bashrc
source ~/.dot-files/bash/default-config
$ cat ~/.dot-files/bash/default-config
source "$(dirname -- "$0")/.git-prompt"
source "$(dirname -- "$0")/.ps1"
source "$(dirname -- "$0")/.alias"
source "$(dirname -- "$0")/.utils"
这不起作用
-bash: ./.git-prompt: No such file or directory
-bash: ./.ps1: No such file or directory
-bash: ./.alias: No such file or directory
-bash: ./.utils: No such file or directory
我正在尝试做什么
我想更改我的 shell chsh -s /bin/bash
,重新启动终端。我希望它能正常工作。
我希望任何人都可以在任何他们想要的地方进行克隆。
.bashrc
我希望人们在他们的和中仅指向每个 shell 的默认配置.zshrc
。
我希望该 repo 的默认配置引用其本身的相对路径。我永远不想使用硬编码的完整路径。
对于 zsh,source "$(dirname "$0")
这就可以了。我理解的步骤如下:
~/.zshrc
直接调用文件的源:~/.dot-files/zsh/default-config
- 所述文件调用源命令,是的,但它插入“我的路径”并
$(dirname "$0")
后跟与“我”位于同一文件夹中的文件的名称。source "$(dirname "$0")/.alias"
转换为source ~/.dot-files/zsh/.alias
Bash 无法工作,不知道为什么。我还能做什么?
答案1
对于 Bash,使用${BASH_SOURCE[0]}
。 (它是一个包含正在读取的文件的整个“堆栈”的数组,但第 0 个数组元素也可以通过 来访问$BASH_SOURCE
。)
例如:
. "${BASH_SOURCE[0]%/*}/.alias"