中山大学

中山大学

我想做的事情应该很简单。但就是不行。

我有一个包含点文件的存储库。我希望能够将此存储库克隆到系统中的任何地方,并且只获取一个文件。然后,我希望该文件根据需要使用相对路径获取其他文件。因为我不想强迫您将此存储库克隆到某个特定位置并硬编码我的所有路径。我希望这是合理的。

因此,我的 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"

相关内容