提高效率从编写 init.sh 开始

有部分人不太愿意定制自己的终端配置,因为:“服务器太多,怎么可能每台都去定制,所以都用默认配置,习惯了就好”。其实道理很简单,算笔账就清楚了,除非你是 SA 每天管理上千台服务器,程序员的话,每天接触的开发服务器也就五台以内。既然 90% 的利益都在那三五台机器上,还在纠结 10% 的事情,这就叫不明智。

还有人担心这 10% 的时间偶尔到裸环境下不适应了,所以拒绝 90% 的时间使用高级配置。这是我听过最荒谬的理由,我天天自己开车上下班,偶尔骑下自行车我也不会忘记怎么骑车。更不因为偶尔需要时怕不会骑了而把汽车卖了每天都坚持骑单车,或者干脆就拒绝学汽车驾驶,拒绝提高自己的车技。我路由器上连 bash 都没有,只有个 busybox 的残缺 shell ,照着理由我要去迁就路由器么?这种说法要不就是看不清楚自己核心利益在哪里,要不就是没体验过汽车快起来可以比单车快几倍。

何况不管是程序员还是 SA,做好配置的同步工作也就行了。如果可以花固定的时间,让终端工作效率提升一倍以上,这种一次性的投资为何不做呢?所以接下来讨论下终端环境下各种配置应该如何管理,如何同步的。

原则 1:托管你的配置

配置需要反复锤炼和迭代,迭代就需要持久化的文件托管和版本控制,不能说每次都凭借记忆从头写一次,这样你的配置永远积累不下来。

所以从 Github 上新建个 config 项目开始,把各种:编辑器,shell,readline,tmux 配置一点点的放上去,新环境中克隆下来,放到一个安全的位置,比如 ~/.local/config 下面。

原则 2:同步到常用服务器即可

如果新登陆一台新服务器,只是为了临时操作一下,那大可不必同步你的配置。只有你判断今后一段时间会反复的在这台服务器上工作,那么就花两分钟同步一下,你甚至可以把你配置的克隆和部署写到一个 bootstrap.sh 文件上,curl 下来一执行,一句话的事情:

sh -c "$(curl -fsSL https://。。。/bootstrap.sh)"

这个脚本将会建立必要的目录,克隆你的配置,再做一些必要的初始化,来到一台新机器就跑这么一行代码,还有人觉得比你部署其他程序复杂么?

原则 3:尽量少用软连接

那么最基本的 .bashrc 文件应该怎么同步呢?第一种方法是将该文件做成一个软连接指向你仓库里的实际的 bashrc 文件;第二种做法是在配置仓库中写一个 update.sh 脚本,自动拷贝仓库里的 bashrc 过去覆盖 ~/.bashrc

前一种方式的问题是本地想做一些临时修改就容易改动到仓库里的源文件把仓库弄脏,这样你后面更新的时候就需要 merge,或者选择先提交。第二种方式的问题是每次更新了仓库,运行 update.sh 就会把原来的 ~/.bashrc 给覆盖掉了,所有本地化配置和临时修改也就全部都没了。

如何同步配置呢?

更合理的做法是新建一个:init.sh 用仓库托管起来,而本地 ~/.bashrc 末尾加一句话:

source ~/.local/xxx/init.sh 

即可,这个给文件末尾追加一句话的事情,可以让前面的 bootstrap.sh 来承担。

这样你的通用配置被放到了仓库里的 init.sh 里面,而本地化的一些临时配置,还可以接着在 ~/.bashrc 其他部分写,同时改写 ~/.bashrc 不会把 config 仓库弄脏;而更新 config 仓库也不会把本地配置覆盖没。

更重要的是,init.sh 可以写成同时兼容:sh, bash, zsh, dash 的模式,每个 shell的配置里面只要 source 它一下就行了,那么 init.sh 里面即可写通用所有 shell 的一些初始化工作,又可以针对不同的 shell 写一些初始化配置。

对于实验性的新配置,写到本地配置里即可,等你用一段时间,觉得好用了,再把它挪到公共配置仓库里固化起来。这样随着时间的积累,你的 init.sh 积累的配置越来越多,shell 越来越顺手。

所以你并不需要托管你的 bashrc,你需要的是一个有版本管理的,可以四处同步的 init.sh。有恒产才能有恒心,如果你每换一个环境都要从头写你的配置,但当然没什么心情写下去;而如果你把配置固化托管到 github 上,四处都能同步使用,你才会隔三岔五的想着去优化迭代。

文末参考

初期建议全部写在 init.sh 里面的,后面复杂了可以进行模块化拆分,现在我的 init.sh 现在基本就是一个入口。可以到 github 上搜索 bash 类型,星星最高的配置,或者按名字 dotfiles 搜索,我的就不拿出来献丑了,写的比我好的多的是。

Shell 方面我唯一可以一看的项目是我的 《Bash 中文速查表》:

https://github.com/skywind3000/awesome-cheatsheets/blob/master/languages/bash.sh

目前全网最全的 bash 简明帮助,或许在你写配置时可以参考用到。

附:我当前的 init.sh (其实没啥内容了,已经被拆分成只剩一个入口了)

# 交互式模式的初始化脚本
# 防止被加载两次
if [ -z "$_INIT_SH_LOADED" ]; then_INIT_SH_LOADED=1
elsereturn
fi# 如果是非交互式则退出,比如 bash test.sh 这种调用 bash 运行脚本时就不是交互式
# 只有直接敲 bash 进入的等待用户输入命令的那种模式才成为交互式,才往下初始化
case "$-" in*i*) ;;*) return
esac# 将个人 ~/.local/bin 目录加入 PATH
if [ -d "$HOME/.local/bin" ]; thenexport PATH="$HOME/.local/bin:$PATH"
fi# 判断 ~/.local/etc/config.sh 存在的话,就 source 它一下
if [ -f "$HOME/.local/etc/config.sh" ]; then. "$HOME/.local/etc/config.sh"
fi# 判断 ~/.local/etc/local.sh 存在的话,就 source 它一下
if [ -f "$HOME/.local/etc/local.sh" ]; then. "$HOME/.local/etc/local.sh"
fi# 整理 PATH,删除重复路径
if [ -n "$PATH" ]; thenold_PATH=$PATH:; PATH=while [ -n "$old_PATH" ]; dox=${old_PATH%%:*}      case $PATH: in*:"$x":*) ;;         *) PATH=$PATH:$x;;  esacold_PATH=${old_PATH#*:}donePATH=${PATH#:}unset old_PATH x
fiexport PATH# 如果是 bash/zsh 的话,source 一下 ~/.local/etc/function.sh
if [ -n "$BASH_VERSION" ] || [ -n "$ZSH_VERSION" ]; then# run script for interactive mode of bash/zshif [[ $- == *i* ]] && [ -z "$_INIT_SH_NOFUN" ]; thenif [ -f "$HOME/.local/etc/function.sh" ]; then. "$HOME/.local/etc/function.sh"fifi
fi# 如果是登陆模式,那么 source 一下 ~/.local/etc/login.sh
if [ -n "$BASH_VERSION" ]; thenif shopt -q login_shell; thenif [ -f "$HOME/.local/etc/login.sh" ] && [ -z "$_INIT_SH_NOLOG" ]; then. "$HOME/.local/etc/login.sh"fifi
elif [ -n "$ZSH_VERSION" ]; thenif [[ -o login ]]; thenif [ -f "$HOME/.local/etc/login.sh" ] && [ -z "$_INIT_SH_NOLOG" ]; then. "$HOME/.local/etc/login.sh"fifi
fi

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/451340.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【鸡翅Club】项目启动

一、项目背景 这是一个 C端的社区项目,有博客、交流,面试学习,练题等模块。 项目的背景主要是我们想要通过面试题的分类,难度,打标,来评估员工的技术能力。同时在我们公司招聘季的时候,极大的…

前端SSR框架(Next、Nuxt)利用宝塔面板部署

1、部署的本质 SSR服务端渲染的框架部署区别于常规的CSR项目的部署,并不是打包之后访问某个文件就行,而是需要在服务器中运行项目之后访问某个地址,无论是基于Vue的Nuxt.js框架还是基于React的Next.js框架道理都是一样的 因此区别于CSR我们…

Django学习-静态文件

注意:配置项是个元祖,如果只有一项,别忘了在元素后面加逗号 settings: STATICFILES_DIRS (os.path.join(BASE_DIR,static),)urls: path(test_static, views.test_static)views: def test_static(request):return render(request,test_stat…

中科星图(GVE)——过火面积识别(dNBR)和CART方法进行火灾识别

目录 简介 函数 sampleRegions(collection,properties,scale,projection,tileScale,geometries) gve.Classifier.Cart(maxNodes,minLeafPopulation,maxDepth) updateMask(mask) 代码 网址推荐 知识星球 机器学习 简介 过火面积识别(dNBR)和CART…

Jlink 直接读取单片机数据

1. 驱动版本 因人而异,这里我使用的是 “J-Flash V6.96” 本人驱动链接:夸克网盘 提取码:rgzk 2. 打开软件 3. 创建jlink工程 4. 选择芯片 此处本人使用芯片 “STM32F103VCT6” 5. 连接单片机 连接成功反馈 6. 读取单片机内部数据 …

WordPress监控用户行为回放插件

在数字营销的世界里,了解用户行为是提升用户体验和转化率的关键。nicen-replay 插件,它能够让您轻松回放用户在网站上的每一步操作,从点击到滚动,再到表单填写,每一个细节都清晰可见 nicen-replay,是一款可…

目标检测——Cascade R-CNN算法解读

论文: Cascade R-CNN: Delving into High Quality Object Detection (2017.12.3) 链接:https://arxiv.org/abs/1712.00726 Cascade R-CNN: High Quality Object Detection and Instance Segmentation (2019.6.24) 链接:https://arxiv.org/abs…

Miniconda管理虚拟环境【Python环境配置】

Miniconda管理虚拟环境【Python环境配置】 1. 下载并安装Miniconda2. 管理虚拟环境3. 管理虚拟环境中的包 1. 下载并安装Miniconda 1. 下载 从清华大学开源软件镜像站 | Tsinghua Open Source Mirror 下载Miniconda:https://mirrors.tuna.tsinghua.edu.cn/anaconda…

基于YOLO11/v10/v8/v5深度学习的安检X光危险品检测与识别系统设计与实现【python源码+Pyqt5界面+数据集+训练代码】

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

技术分享:A-23OH型树脂在汽车涂装废溶剂回收中的应用

在当今汽车制造业竞争激烈的环境下,提高生产效率、降低成本的同时,满足环保要求已成为各制造商追求的核心目标。水性涂料因其环保、节能等多重优势,在汽车涂装领域的应用日益广泛。然而,随之而来的喷涂废溶剂处理问题也日益凸显。…

面试应该问什么?

在求职者面试的过程中,向面试官提问是一个展现自己积极态度、对职位和公司兴趣以及进一步了解工作环境和职业发展机会的重要环节。以下是一些求职者可以在面试中向面试官提问的问题,这些问题旨在帮助你更全面地了解未来的工作环境、团队文化、以及个人职…

【SSM详细教程】-04-Spring基于注解的组件扫描

精品专题: 01.《C语言从不挂科到高绩点》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482 02. 《SpringBoot详细教程》课…

HTML5教程(三)- 常用标签

1 文本标签-h 标题标签&#xff08;head&#xff09;&#xff1a; 自带加粗效果&#xff0c;从h1到h6字体大小逐级递减一个标题独占一行 语法 <h1>一级标题</h1><h2>二级标题</h2><h3>三级标题</h3><h4>四级标题</h4><h5…

CANoe_CDD_FaultMemory_显示<DTC is defined in the database>解决方法

1、显示<DTC is defined in the database> 2、问题原因 a、在Base Variant中的Fault Memory没有数据 b、新建数据&#xff08;参考导入或者新建方法&#xff09; c、复制数据过来 &#xff08;在Fault Memory中Diagnostic Trouble Codes的Avariable中全选复制到此处&am…

FFmpeg的简单使用【Windows】--- 指定视频的时长

目录 功能描述 效果展示 代码实现 前端代码 后端代码 routers 》users.js routers 》 index.js app.js 功能描述 此案例是在上一个案例【FFmpeg的简单使用【Windows】--- 视频混剪添加背景音乐-CSDN博客】的基础上的进一步完善&#xff0c;可以先去看上一个案例然后再…

Java基于SSM微信小程序物流仓库管理系统设计与实现(lw+数据库+讲解等)

选题背景 随着社会的发展&#xff0c;社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个…

mysql的各种存储引擎

文章目录 前言1. InnoDB特点 2. MyISAM特点innodb与myisam引擎之间的区别 3. MEMORY特点 4. ARCHIVE特点 5. NDBCluster特点 6. FEDERATED特点 7. CSV特点 总结 前言 MySQL 支持多种存储引擎&#xff0c;每种引擎都有其独特的功能和适用场景。存储引擎是指数据库管理系统用来存…

[PHP]__callStatic

第一种&#xff1a;以下代码不会触发__callStatic&#xff0c;也不会报错 test是空方法 <?php class A {public function test(){}public static function __callStatic($method, $args){print_r(aaaaaaaaaaaaaaaaaaaaa);} }A::test();第二种&#xff1a;以下代码不会触发…

MYSQL-多表查询和函数

第一题讲解 # 1. 查出至少有一个员工的部门&#xff0c;显示部门编号、部门名称、部门位置、部门人数。 分析:(分析要查的表): (显示的列):(关联条件):(过滤条件):[分组条件]:[排序条件]:[分页条件]:SELECT d.deptno, dname, loc, count(empno) FROM dept d JOIN emp e ON d…

C#从零开始学习(基本语法概念)(2)

深入C# 本章所有的代码都放在 https://github.com/hikinazimi/head-first-Csharp 控制台项目结构 每个C#程序采用同样的方式组织,命名空间,类和方法 using System;namespace helloworld//命名空间 {class Program//类{static void Main(string[] args)//程序入口{Console.Writ…