我是一个非常活跃的命令行用户,我到处都有 shell 帐户。MacBook、Linux 台式机、Linux 服务器、XP 上的 Cygwin,应有尽有。
如何使用所有平台上可用的有限工具使我的 shell 配置(.bashrc
等)在所有这些机器上保持同步?.vimrc
我一直rsync
在以非常有限的方式使用,包括在需要时手动复制一些文件,但我想要一种标准方法来在我的所有机器上设置相同的基本 shell 环境。告诉我你的 shell 账户管理策略。
我是一个非常活跃的命令行用户,我到处都有 shell 帐户。MacBook、Linux 台式机、Linux 服务器、XP 上的 Cygwin,应有尽有。
如何使用所有平台上可用的有限工具使我的 shell 配置(.bashrc
等)在所有这些机器上保持同步?.vimrc
我一直rsync
在以非常有限的方式使用,包括在需要时手动复制一些文件,但我想要一种标准方法来在我的所有机器上设置相同的基本 shell 环境。告诉我你的 shell 账户管理策略。
我在 Dropbox 上有具有全局、每个操作系统和每个机器外壳配置的文件夹:
$ ls ~/Dropbox/shell/bash
bashbootstrap bashrc
bashrc-Darwin bashrc-Darwin-laptopname bashrc-Darwin-mininame
bashrc-Linux bashrc-Linux-machineone bashrc-Linux-machinetwo
bashrc
在每台机器上加载,bashrc-Linux
,bashrc-Darwin
在它们各自的操作系统上加载,并且几个配置特定于各个机器。(顺便说一下,Darwin 是 OS X 的类似 BSD 的内核的名称。)
将这一切联系在一起的是bashbootstrap
文件。它以增加特定性的顺序加载每个适用的配置文件,这允许每个操作系统和每个机器覆盖具有更高的优先级。此外,我们默默地跳过丢失的配置文件;你不需要为每台机器创建空配置文件来保持脚本的运行。
在一台新机器上,在安装 Dropbox 之后~/Dropbox
,我移除了默认设置.bashrc
,而是将引导文件符号链接到其位置:
$ mv ~/.bashrc ~/.bashrc.bak
$ ln -s ~/Dropbox/shell/bash/bashbootstrap ~/.bashrc
哦,这是bashbootstrap
文件的内容:
if [ -z "$PS1" ]; then
return
fi
dropboxshelldir=~/Dropbox/shell
dropboxdir=$dropboxshelldir/bash
masterbashrc=$dropboxdir/bashrc
osbashrc=$masterbashrc-`uname`
localbashrc=$osbashrc-`hostname | cut -d. -f1`
echo -n "Applicable shell configs: "
for bashfile in "$masterbashrc" "$osbashrc" "$localbashrc"; do
if [ -r $bashfile ]; then
. $bashfile
echo -n "`basename $bashfile` "
fi
done
echo
# Set convenience aliases
myed=${VISUAL:-${EDITOR:-vim}}
alias editbashrc="$myed $masterbashrc"
alias editosbashrc="$myed $osbashrc"
alias editlocalbashrc="$myed $localbashrc"
最后一点,这个脚本还提供了三个方便的别名来编辑你的 Bash 配置文件,而不必记住它们的存储位置。
editbashrc
:编辑全局配置文件。editosbashrc
:编辑特定于操作系统的配置文件。editlocalbashrc
:编辑机器特定的配置文件。我只在 Bash 上对此进行了测试,但它可以在其他 Bash 等 shell 上运行。但是,正如他们所说,您的里程可能会有所不同。
我在这里发表了一篇关于此的博客文章。
如果您有权访问源代码控制,我只需将它们签入。这样您就可以在多台机器上同步它们,并且可以在需要时进行比较/回滚。如果您在工作中没有 CVS/SVN,则可以使用免费选项。
我更喜欢不同机器上的 Vim、Fish、Sway 等配置文件略有不同,所以我制作了一个程序(filetailor)来处理这个问题,然后将结果与 Git 同步。
filetailor是一个开源 Python 程序,它可以使用特定于设备的变量或使用文件中特定于设备的注释对文件进行小幅更改。
例如,除了带有 hostname 的设备之外,每台设备上都将注释掉以下行device1
。
alias MYHOME='/home/dev1home/' #{filetailor device1}