想维护一套自己的 dotfiles 顺便练练 Shell 编程,有没有值得参考的仓库推荐一下

170 天前
 enchilada2020

Linux 五年使用经验的骨灰级入门选手,之前都是现用现查,查完就忘,主打一个能干活就行。最近经常需要连到服务器上查各种日志和配置之类,但往往服务器默认的 Shell 环境太裸了,非常难用,所以痛下决心想把这块搞定。

主要是想要能在主流 Linux 环境下快速配置,做到任何环境都有同样的命令行体验,不追求过度花里胡哨,保证最小可用性与生产力即可。

因为要在保证体验统一的前提下尽量兼顾各种可能的情况,比如一些限制比较严格的生产环境之类的,遵循奥卡姆剃刀原则,如无必要勿增实体,所以优先选择那种主流服务器发行版都一定会带的工具,相比 Zsh 会选择 Bash ,相比 Emacs 会选择 Vim 等等。

我知道有很多现成的优秀项目,比如 Oh My Zsh/starship ,但感觉这些大多是面向个人本地开发环境的,不适用于远程到生产环境的服务器做调查的场景。毕竟你总不可能为了查个日志在生产环境上搞了一大坨有的没的。

简单看过几个 GithHub 上比较有名的个人 dotfiles 仓库,例如 holmanMathias的,一个是面向 Mac ,一个用了 Zsh ,都不太理想。目前感觉 这个最合心意,但不太确定里面的写法是否符合最佳实践,比如其中的几个 util:

answer_is_yes() {
    [[ "$REPLY" =~ ^[Yy]$ ]] \
        && return 0 \
        || return 1
}

ask() {
    print_question "$1"
    read -r
}

ask_for_confirmation() {
    print_question "$1 (y/n) "
    read -r -n 1
    printf "\n"
}

...感觉 askask_for_confirmation 完全简化合并成一个函数的。

2293 次点击
所在节点    Linux
21 条回复
tpxcer
170 天前
dotfiles 是个啥
enchilada2020
170 天前
@tpxcer
> “Dotfiles” are the funky little files in your *nix-based home directory that allow you to customize your nerdery: change how your prompt looks, set up your $PATH, adjust settings for Ruby’s IRB, completely change everything about Vim, and about a billion and a half other things. They’re fun.

https://zachholman.com/2010/08/dotfiles-are-meant-to-be-forked/

正文里的链接随便点进去一个都是 dotfiles 仓库…
mongoose
170 天前
我自己 copy 了一些函数到我自己的 dotfiles 中

https://github.com/gruntwork-io/bash-commons
https://github.com/ralish/bash-script-template
https://github.com/hedzr/bash.sh

但是,具体的 dotfiles ,我没有具体收藏过链接。

事实上,如果只是为了维护自己的 dotfiles 的话,更多的是获取系统信息,更好的 log 格式化,字符串处理,反而是这种交互用的比较少吧。我用 stow 来链接我的 dotfiles ,win 下用 dploy 链接。
noahlias
170 天前
既然最小可用了 不加任何东西 不应该是最 nerd 的吗
纯文本不开任何高亮提示
另外你说的这些 util 不都是 snippet 吗
rick13
170 天前
一步到位学 nix 。。
valord577
170 天前
1. 如果是配置 shell 的话 建议 alias 比如 alias ll='ls -alh' 其他的 .vimrc 等等
2. 如果是面向服务器的话 可以用 docker 把要操作的目录-v 映射进来 使用 docker 配置好 shell 进行操作 (都自己管理服务器了 还不能装个 docker? [斜眼笑])
noqwerty
170 天前
只是为了多台机器同步配置环境的话可以看看 chezmoi
tywtyw2002
170 天前
其实大家都不会没事闲着去天天 refactor dotfiles 去。

很多时候就是想到什么写什么进去,图的就是方便。

现在有了 atuin ,无限 history 同步,更没有动力写 bash/zsh function 了。想找什么直接 ctrl+r 搜历史就行了。


管理 dots ,我推荐用 chezmoi 。


服务器上面的 dots ,要看是个人服务器还是生产的。安全原因,生产环境肯定不能装任何 dot ,至少我们是这么要求的。 日志简单的的 less/grep 搞定,复杂点 scp 拖回来 慢慢搞。
Jeremial
170 天前
要不看看我的, 主打一个够用就行.
之前还加了各种判断环境, 可以自定义功能, 但是后面发现根本用的不到, 但是也没删掉.

现在用的最多的就是 zsh 里面的 zimfw, 还有安装下 homebrew, neovim 啥的

https://github.com/wyntau/dotfiles
neroxps
170 天前
没人提 acme.sh
enchilada2020
170 天前
@noahlias 你说的那种情况太极端了 最小可用不是啥也没有 就是因为裸的不满足可用趁手有生产力的状态才需要一套最基本的 dotfiles …至少基本的高亮 补全 清晰的 PS1 之类的要有 但需要额外安装的字体图标等等属于可有可无
我在看他的代码时感觉不够优雅 想看看比较优秀的 shell 代码应该是什么样的
0o0O0o0O0o
170 天前
优秀的 shell 代码可以看那些维护了几十年仍在活跃的包,或者 https://github.com/bminor/bash/tree/master/examples

不过我不觉得为这个场景维护 dotfiles 是很常见或很明智的做法。
agagega
170 天前
觉得 shell 写起来兼容性差反人类的话,可以试试用 Python 写,反正现在几乎所有常见的类 Unix 环境都自带 Python
blessingsi
170 天前
#12 +1 ,这个场景真不太合适搞 dotfiles 。只是查个日志啥的就裸着用吧。。。
enchilada2020
170 天前
@tywtyw2002
@0o0O0o0O0o

感觉使用姿势错了?我目前有需求的应用场景:
1. 本地开发环境配置,包括新机器及各个项目下的 VS Code Dev Container 统一配置
2. 服务器用户目录下的配置,保持与本地开发环境基本一致的使用体验

因为是个人维护的 dotfiles ,清楚每一行代码都干了什么,所以就算在生产环境上用也不会有什么安全隐患…?同时也正是考虑到安全问题,不想用现成项目,以及那些需要额外安装的工具,因为不可控。
经验不足,理解有误的地方请不吝赐教,感谢!
enchilada2020
170 天前
@agagega 确实反人类,以前一直不喜欢就没碰,但感觉在*nix 世界只有 C 跟 Shell 是不可替代的。另外出于工作需要,有大量祖传 shell 要理解并根据需要修改,所以想着还是老老实实学一下好了。
enchilada2020
170 天前
@blessingsi 那什么样的场景比较合适维护 dotfiles 呢?只是本地环境的话还是用现成项目就好了,方便省心又好看 hhh
tengyufei
170 天前
可以看看 ble.sh ,这个项目 作者堪称 bash 仙人
tywtyw2002
170 天前
@enchilada2020 #15
生产环境就是干干净净,除了业务相关的程序,其他的都不装啊。
业务程序也是遵守 devops 的 practice ,自动化 CI/CD 打包。
不用 k8s ,业务主机也是基于 IaC 的啊,Terraform 什么的。
99%的情况下,都不需要员工去 login 到生产环境里面,都是自动化部署了,除非升级,或者大错误导致系统级别的事故,才需要去登录。

如果是测试环境,那就跟私人电脑差不多,只要分配给你的资源你爱怎么折腾怎么折腾没人管。



1. 本地开发环境配置,包括新机器及各个项目下的 VS Code Dev Container 统一配置
这个只要同步 dot 文件就好了,如果机器类型不同那就用 chezmoi 去管理

2. 服务器用户目录下的配置,保持与本地开发环境基本一致的使用体验
一样,只要服务器让你搞,你就同步你的 dots 就好了。


可能是大家理解不同。
dots 一般来说不就是指代在*unix 下的配置文件吗。因为那些文件是 dot 开头的。。。

bash/zsh, dot 文件主要是配置 alias ,completion 之类的,还有一些你常用的命令缩写。

比如说这类的
```
function cssh(){
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null $*
}

function fixssh() {
if [[ -n $TMUX && -n $SSH_AUTH_SOCK ]]; then
eval $(tmux show-env \
| sed -n 's/^\(SSH_[^=]*\)=\(.*\)/export \1="\2"/p')
fi
}
```
Davic1
169 天前
如果你需要同步 dotfiles ,推荐一篇文章 https://www.atlassian.com/git/tutorials/dotfiles

我目前就是这么做的,https://github.com/0ptimista/dotfiles (主要用在 macOS 上)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1055064

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX