管理linux下软件的配置文件dotfile(rc files)

在linux下,各种软件的配置文件大多存储于以“.”开头以“rc”结尾的文件中并存放于用户的个人目录~/中,也就是俗称的dotfile或者rc file,例如zsh的配置文件.zshrc,vim的配置文件.vimrc等等。

当我们初次使用一些软件时经常会花大量时间对相应的dotfile(rc file)进行配置,让软件以符合我们期望的方式工作,在使用时也时常会对dotfile进行调整。但是当我们希望在新电脑上恢复多个软件配置或者在多台电脑上共享一台电脑对dotfile的修改时,逐一对各个dotfile进行管理非常不方便。

所以我来介绍一下我管理dotfile的方式

所需软件介绍

我在管理dotfile时用到的软件是在Github上开源的rc file management(rcm)软件,这个软件主要思想就是将所有你希望用rcm管理的dotfile移动并集中存储在一个目录中(默认是在~/.dotflies下),并在你的个人目录下创建所有被rcm管理的dotfile的符号连接(symlink)。如果你熟悉这个软件可以看看“我的日常使用方法”这一节的内容。

我们可以在该集中存储目录下建立git repository进行版本控制,同时也可托管到github或gitcafe上方便多台机器共享。当你希望使用别人分享给你的rcm目录下的dotfile时则rcm可以利用多目录存储管理功能,同时调用多个分享目录下的文件。

这套软件主要包括了一下4个命令和一个配置dotfile文件~/.rcrc(注意在安装好rcm后不会有配置文件,若要使用需手动创建)

  • lsrc:列出当前所有通过rcm管理的dotfile,以及其对应的符号链接位置
  • mkrc:将指定的dotfile移动至你的集中存储目录,并在~/目录下创建相应的符号链接
  • rcup:根据rcm管理的dotfiles更新当前用户目录下已存在的符号链接或创建新的符号链接
  • rcdn:删除通过rcm创建的dotfile的符号链接

安装RCM

我主要是用Mac和Ubuntu,他们的安装方法如下

Mac

brew tap thoughtbot/formulae
brew install rcm

Ubuntu

sudo add-apt-repository ppa:martin-frost/thoughtbot-rcm
sudo apt-get update
sudo apt-get install rcm

Arch Linux

https://aur.archlinux.org/packages/rcm/

Debian-based

wget https://thoughtbot.github.io/rcm/debs/rcm_1.2.3-1_all.deb
sha=$(sha256sum rcm_1.2.3-1_all.deb | cut -f1 -d' ')
[ "$sha" = "fb8ec2611cd4d519965b66fcf950bd93d7593773659f83a8612053217daa38b4" ] && \
sudo dpkg -i rcm_1.2.3-1_all.deb

Gentoo-based (including Funtoo)

sudo emerge layman
sudo layman -f --overlays https://github.com/bronislav/overlays/raw/master/layman.xml --add bronislav
sudo emerge rcm

OpenBSD(-current)

sudo pkg_add rcm

openSUSE/RHEL/CentOS

http://software.opensuse.org/download.html?project=utilities&package=rcm

其他Linux发行版

这个软件使用了标准GNU autotools,可以尝试一下方法编译安装

curl -LO https://thoughtbot.github.io/rcm/dist/rcm-1.2.3.tar.gz && \

sha=$(sha256 rcm-1.2.3.tar.gz | cut -f1 -d' ') && \
[ "$sha" = "502fd44e567ed0cfd00fb89ccc257dac8d6eb5d003f121299b5294c01665973f" ] && \

tar -xvf rcm-1.2.3.tar.gz && \
cd rcm-1.2.3 && \

./configure && \
make && \
make install

RCM使用方法

接下来介绍一下我的使用方式

通过mkrc命令创建Dotfiles管理目录

如果你是第一次在本地使用rcm,则可以通过mkrc命令来创建dotfiles管理目录,并指定要用使用rcm管理哪些文件.

cd ~
mkrc .zshrc .zsh-custom 

命令执行完毕后,会将你指定的dotfile默认移动到/.dotfiles目录下并重命名将文件名前的“.”去掉,同时在/目录下创建相应的符号链接,如果你的dotfile是存储在某个文件夹下时,例如~/.example/config, 则程序会将文件拷贝至~/.dotfiles/example/config,并在原目录中创建符号连接

ls -l ~/dotfiles
 -rw-r--r--  1 Rain staff 1065 8 15 13:20 zshrc
 drwxr-xr-x  3 Rain staff 102B 8 15 13:20 zsh-custom

cd ~
ls -l .zshrc
 lrwxr-xr-x  1 Rain staff 35B 8 15 13:20 .zshrc -> /Users/Rain/.dotfiles/zshrc

ls -l .zsh-custom/themes/wty.zsh-theme 
 lrwxr-xr-x  1 Rain staff 61 8 15 13:20 .zsh-custom/themes/wty.zsh-theme -> /Users/Rain/.dotfiles/tag-zsh/zsh-custom/themes/wty.zsh-theme

此时你可以使用git在~/.dotfiles目录下创建仓库进行版本管理

cd ~/.dotfiles
git init
git add .
echo "These are my config dotfiles" >> README.md
git commit -m "initial commit"

如果你希望更改创建的dotfiles管理目录的位置,可以通过在mkrc命令中带上-d参数,或者
在~/.rcrc配置文件中配置默认的目录

mkrc -d ~/.mydotfiles .zshrc

#in ~/.rcrc file
#此参数可以设置多个目录,为其余几个命令服务,对mkrc命令来说第一个目录为默认目录,若不填写则~/.dotfiles为默认目录
DOTFILES_DIRS="~/.mydotfiles"

注意事项

由于rcm软件的设计问题,请勿对已经由rcm管理并创建的符号连接使用mkrc命令,否则会让~/.dotfiles下的文件变成指向自己的符号链接并丢失源文件。

为了避免符号链接带来的问题,我们可以在使用mkrc命令时带上“-C”参数来改变创建符号链接的行为,或者在~/.rcrc文件中加入如下参数,将所有创建符号链接的行为都改为拷贝,这个将影响所有的rcm命令

#in ~/.rcrc files
COPY_ALWAYS="*"

mkrc -C .zshrc

我最开始尝试使用这个软件的时候因为这个问题导致丢失了.zshrc,而且并未备份,又得重新配置一遍,幸好有oh-my-zsh,Orz..

但是使用符号链接的好处就是当你对~目录下我的dotfile进行修改时,相当于直接对dotfiles管理目录中的文件进行了修改,这样备份更加方便,我认为只要小心一点还是符号链接更加方便,如何取舍就看大家啦。

mkrc命令高级用法

mkrc命令还支持将dotfiles通过tags分类存放,可以方便的对不同软件的配置文件进行分类管理,比如通过如下命令创建dotfiles管理目录,

cd ~
mkdir -t zsh .zshrc

此命令将会在./dotfiles目录下创建以“tag-”开头的目录,效果如下

ls -l ~/.dotfiles/tag-zsh/zshrc                                                
 -rw-------  1 Rain  staff  1065  8 15 15:42 .dotfiles/tag-zsh/zshrc

mkrc还能根据hostname来进行分类管理,mkrc的更多参数请查看man page mkrc(1)
在使用了mkrc的分类管理参数后会影响到接下来要介绍的rcup命令的行为

通过rcup命令更新dotfiles

基础用法

当你没有使用任何分类管理参数时,你的所有dotfile应该都存储在/.dotfiles目录下,此时你只需要简单的执行rcup命令,则rcm会在目录下创建所有/.dotfiles下文件对应的符号链接,当配置了COPY_ALWAYS=“*”时则会改为拷贝,若目录下存在对应文件且内容不同时,会提示是否覆盖。且若、。dotfiles中的文件夹在中不存在时会自动创建,样例如下

rcup -v   
 identical /Users/Rain/.rcrc
 '~/.dotfiles/tag-zsh/zsh-custom/themes/wty.zsh-theme' -> '~/.zsh-custom/themes/wty.zsh-theme'
 overwrite /Users/Rain/.zshrc? [ynaq] y
 removed '/Users/Rain/.zshrc'
 '/Users/Rain/.dotfile/zshrc' -> '/Users/Rain/.zshrc'

高级用法

当不加任何参数时,rcup默认只将没有通过tag进行分类的且如果通过hostname分类了则分类hostname与本地hostname相同的dotfiles更新至你的~目录

当你使用tag来构建你的dotefile目录时,你可以通过给rcup命令加上“-t”参数或者在~/.rcrc中配置TAGS="tag1 tag2"来更新相应分类下的dotfiles,或者加上“-B”参数来指定一个hostname或在~/.rcrc文件中配置HOSTNAME参数,从而取消自动计算hostname。

如果加了“-t”参数以后,lsrc,rcup和rcdn命令都只会加载没有用tag分类的和“-t”参数给出的tag相关的dotfile,其他tag下的dotfiles不会被加载

你可以通过lsrc命令查看当前rcup命令能作用于哪些dotfiles,如果要查询有哪些tag,只需进入~/.dotfiles目录查看那些以“tag-”开头的目录即可。

lsrc
 /Users/Rain/.rcrc:/Users/Rain/.dotfiles/rcrc

lsrc -t zsh
 /Users/Rain/.rcrc:/Users/Rain/.dotfiles/rcrc
 /Users/Rain/.zshrc:/Users/Rain/.dotfiles/tag-zsh/zshrc

rcup -v -t zsh
 identical /Users/Rain/.rcrc
 '/Users/Rain/.dotfiles/tag-zsh/zshrc' -> '/Users/Rain/.zshrc'

当你希望rcup同时载入多个dotfiles管理目录,比如当你使用他人分享给你的通过rcm创建的dotfiles管理目录时,你可以使用rcup的“-d”参数来指定从哪个文件夹来更新~目录下的文件

rcup -d ~/.SarahDotfiles -t zsh
 '/Users/Rain/Download/.SarahDotfiles/tag-zsh/zshrc' -> '/Users/Rain/.zshrc'

我的日常使用方法

一般我的使用方法是,使用一个dotfiles管理目录统一管理dotfiles,并在该目录里建立git repository进行版本控制

其中

  • rcm的配置dotfiles .rcrc以tag rcm分类
  • 同一个软件的所有dotfile配置文件都通过一个tag来分类管理
  • 在.rcrc中配置TAGS=“所有以用于分类的tags”
  • 在.rcrc中配置EXCLUDES="忽略dotfiles管理目录中的某些文件",比如github的README.md等

当迁移到新的电脑上时,将dotfiles管理目录放置于~/.dotfiles,并采用如下方法

#1.恢复rcm的dotfile
rcup -t rcm

#2.查看当前有哪些可以恢复的dotfiles
lsrc

#3.因为.rcrc配置中已经配置了原电脑所有的分类,则可以直接全部恢复
rcup

#4.若只想部分恢复,则指定tag
rcup -t zsh

当使用别人分享过来的dotfiles管理目录时,采用如下方法

#1.取消自己对应的配置
rcdn -t zsh -v
 removed '/Users/Rain/.zshrc'

#2.将别人的对应配置符号连接过来,进行测试
rcup -d ~/.SarahDotfiles -t zsh
 '/Users/Rain/Download/.SarahDotfiles/tag-zsh/zshrc' -> '/Users/Rain/.zshrc'

#3.如果不满意则取消对方的配置,并重新链接回自己的配置
rcdn -d ~/.SarahDotfiles -t zsh
rcup -t zsh

#4.如果满意则copy对方的配置到我的~目录,在自己重建dotfiles管理目录中对应的文件
rcup -d ~/.SarahDotfiles -t zsh -C
mkrc .zshrc

#5.使用git对自己的dotfiles管理目录进行版本管理

更多使用方法请参考man page rcup(1), mkrc(1), rcdn(1), lsrc(1), rcrc(5)rcm(7) quick start tutorial.


本文个人博客地址: http://wty.im/2015/08/14/use-rcm-to-manage-your-dotfile-rc-file/
Github: https://github.com/wty21cn/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,688评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,559评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,749评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,581评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,741评论 3 271
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,684评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,122评论 2 292
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,847评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,441评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,939评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,333评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,783评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,275评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,830评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,444评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,553评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,618评论 2 249

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,050评论 18 139
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 11,986评论 2 34
  • Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音。了解发音是有意...
    萤火虫de梦阅读 98,290评论 9 468
  • 文 | 晨儿 流光易把人抛弃, 时光里,一层层泪纱我们的故事一章又一章 岁月沧桑流逝,一年又一年,老去了容颜,成熟...
    晨妤儿阅读 359评论 1 1
  • “在我们每一个人的内心深处,都藏着一个人,每次想起他的时候,会觉得有一点点心痛,但我们依然愿意把他留在心底。就算今...
    自律女性vlog阅读 536评论 9 5