使用 Shell 脚本跨平台共享 .dotfiles
在我的职业生涯中,我经历过许多 Linux 环境。我的第一个工作单位就有一个 Linux 环境,我可以自己.vimfiles
设置。然后,当我在家里第一次安装 Ubuntu 时,我会有一个.bashrc
文件来存储一些别名。之后,在我的 Windows 系统上,在我的类似 Linux 的 Cygwin 环境中,我必须复制同样的.bashrc
文件,并且可能还创建了一个.screenrc
GNU 配置界面。之后,在我的个人 DigitalOcean 服务器上,我又有了一个 Linux 环境,我必须再次复制我的配置。然后,我在一台新电脑上安装了 Linux,需要再次查找和复制我的别名……等等等等。
我可能已经手动复制本地 Linux 配置的部分内容二十遍了,后来才意识到,这必须以某种方式实现自动化,这样每次处理新的 Linux 环境时,就不用费力地准备所有配置了。在本文中,我将向你展示我是如何解决这个问题的。
.dotfiles
为什么我在标题中选择使用 Shell 脚本?这样做是为了最大限度地减少在任何服务器上启动和运行所需安装的依赖项数量。
使用 Git 对点文件进行版本控制
首先,除了使用版本控制之外,还有什么最好的方法来保存多个文件(,,)的状态以.bashrc
保持它们同步?.gitignore_global
bin/
当考虑主目录中的版本文件时,人们可能会认为存在问题......
您想要版本控制的点文件只是您主目录中文件/目录的一个很小的子集
确实如此。如果你开始对主目录进行版本控制,所有其他不相关的文件/目录都会显示为未版本控制,从而git status
一直混淆你的输出。
为了解决这个问题,我刚刚.gitignore
在主目录中创建了一个包含以下内容的文件:*
。基本上忽略所有内容。
这完全没问题。每当我想添加新文件时,我都可以git add -f <file>
绕过忽略。
在新环境中克隆 .dotfiles
现在我们已经在 Git 中对点文件进行了版本控制,我们需要能够将其克隆到新的环境中才能使用它们。
在任何新的 Linux 环境中,理想情况下我们都希望将点文件克隆到主目录中。然而,在每个 Linux 环境中,主目录都不是空的,而且 Git 也不提供克隆到现有目录的方法。
所以我们需要克隆到一个新目录。我们可以将其命名为dotfiles
,它可以位于我们的主目录中。
现在,我们需要将文件从目录复制dotfiles
到主目录。这又有一些问题需要解决:
- 对于非 Linux 专家来说,从目录内递归复制文件(包括以点开头的文件)通常并不是一件容易的事(我们希望对大多数点文件进行版本控制)
- 我们的新 Linux 环境可能
.bashrc
已经自带了一些文件,我们可能不想盲目地用自己的文件覆盖它们。也许这实际上是我们之前的一个旧 Linux 环境,.bashrc
里面有一些我们感兴趣的内容。 - 此外,担心这些也只是浪费时间。最好尽快在任何 Linux 环境中准备好所有点文件,这样就不会觉得这是一件苦差事了。
那么为什么不把这一切自动化呢?
使用安装程序作为 bash 脚本
我并不是 bash 脚本的忠实粉丝,但是它们的可移植性非常好,所以我选择制作其中一个。
那么,bash 脚本会放在哪里呢?当然,它会在我们的点文件中进行版本控制。我自己把它放在了bin/install_dotfiles.sh
……
解决在复制文件时如何包含以点开头的文件的问题的答案*
是通过设置:
shopt -s dotglob
现在你知道你需要什么了……但你可能会忘记。所以把它留在你的 Bash 脚本里,这样你就不用记住了!
另一件事是如何避免覆盖现有文件。
如果您不知道,可以传递一个参数,cp
该参数会为任何可能被副本覆盖的文件保留编号备份。它是--backup=numbered
。
因此,初始安装脚本将复制所有文件以及备份,包括.git
文件夹和.gitignore
文件,以确保您的主文件夹已版本化,但忽略所有文件。
bash 脚本基本上包含:
#!/bin/bash
shopt -s dotglob
cd ~/dotfiles
cp -rv --backup=numbered * ~
就是这样,我们有一种可移植的方法,可以通过一个简单的初始安装程序 bash 脚本在 Linux 环境之间同步点文件,每个新环境只需运行一次。
Mac 版附加功能
不幸的是,要使此功能在 Mac 上运行,还需要一个依赖项。
为了使其cp
在 macOS 上的工作方式与在 Linux 中相同(对于--backup=numbered
),您需要确保安装 coreutils(例如使用brew install coreutils
),然后确保cp
在之后使用此代码使用 GNU 命令setopt
:
# Wrapper for cp to work in macOS.
cp() {
if [ -x "$(command -v gcp)" ]; then
command=gcp
else
command=cp
fi
command $command "$@"
}
最后一个扩展名:dist 文件
您可能有一些本地配置文件不想进行版本控制,但希望在新的 Linux 环境中初始安装一个默认的“dist”版本。为此,您可以创建一个名为“distributed”的文件夹,.dotfiles.dist
其中包含所有这些文件。复制文件后,在脚本文件的末尾,您可以执行以下操作:
cp -rv --backup=numbered .dotfiles.dist/* ~
如果您有兴趣,可以在这里查看我的点文件安装程序脚本。
鏂囩珷鏉ユ簮锛�https://dev.to/amcsi/sharing-dotfiles-cross-platform-with-a-shell-script-o2j