问题描述
我在很多不同的机器上工作,都运行 Ubuntu(并不总是相同的版本)。我对我的提示进行了一些非常基本的自定义,我希望在所有机器上都可以使用。
我目前使用 Dropbox 并将所有其他 “dot files” 存储在那里,例如我的 .vim/.vimrc .gitconfig .ackrc。然后我只需将它们从我的 Dropbox 文件夹链接到我的主文件夹。瞧,所有机器都同步了。
我不确定用我的 bashrc 做这样的事情会产生什么影响。任何人都可以提供建议吗?也许是一种在 bashrc 中加载单独文件的简单方法?
最佳方案
我没有看到任何真正的影响,但我想这取决于你在那里有什么!如果只是在任何地方都一样的快速别名和装饰性的东西,我看不出任何问题。
您可以将 .bashrc
移动到 Dropbox 文件夹中的某个位置,然后在每台机器上进行符号链接。
mkdir -p ~/Dropbox/dotfiles
mv ~/.bashrc ~/Dropbox/dotfiles/.bashrc
ln -s ~/Dropbox/dotfiles/.bashrc ~/.bashrc
我的主文件夹中实际上有很多点文件,它们实际上是我的 Dropbox 帐户中共享文件夹的符号链接。
另一种选择是您可以在 Dropbox 文件夹中创建一个文件,由 .bashrc
获取:
即,在您的 .bashrc
中,输入:
source $HOME/Dropbox/dotfiles/bashrc-shared-settings
然后创建一个 bashrc-shared-settings 文件,这是你想在所有机器上使用的东西,你仍然可以保留单独的 .bashrc
文件。
(您也可以在 bash 中将 source
缩写为 .
。)
次佳方案
我能想到的主要风险是您必须记住同步与备份不同。任何错误都将同步到您的所有机器。
要在 ~/.bashrc
中包含一个单独的文件,请添加如下内容:
if [ -f ~/.foo ]; then
. ~/.foo
fi
其中 ~/.foo 是单独的文件。
第三种方案
通常,集中配置文件是一件好事!如果要自定义基于给定操作系统或主机名运行的内容,可以在 .bashrc 中执行以下操作:
export HOSTNAME=`hostname | cut -f1 -d'.'`
if [ -f ~/.bash/os/$OSTYPE.sh ]; then
source ~/.bash/os/$OSTYPE.sh
fi
if [ -f ~/.bash/host/$HOSTNAME.sh ]; then
source ~/.bash/host/$HOSTNAME.sh
fi
然后,创建一个 .bash 目录以及该目录下的 os 和 host 目录,并将任何自定义设置放在名为 <whatever>.sh 的文件中,其中 <whatever>是您要自定义的操作系统类型或主机。
我将所有这些文件保存在 dropbox 中,我的 Dropbox 文件夹中有一个名为 link_dropbox 的 bash 脚本,可帮助我方便地将它们链接到:
#!/bin/bash
#Array of <source><space><link> target->symlink mappings
linkarray=( "~/Dropbox/config/bashrc ~/.bashrc"
"~/Dropbox/config/bash ~/.bash"
"~/Dropbox/config/vimrc ~/.vimrc"
"~/Dropbox/config/vim ~/.vim"
"~/Dropbox/config/ssh ~/.ssh"
"~/Dropbox/config/screenrc ~/.screenrc"
"~/Dropbox/bin ~/bin" )
#turn off globbing to split each entry on spaces
set -f
for entry in "${linkarray[@]}"
do
targets=( $entry )
#eval will expand the tildes
eval from=${targets[0]}
eval to=${targets[1]}
#if the target exists and is not a symlink, err on the side of caution
if [ -e "$to" -a ! -L "$to" ]
then
echo "$to exists and is not a link, skipping..."
else
#probably safe to delete an existing symlink
if [ -e "$to" ]
then
rm $to
fi
ln -s $from $to
fi
done