0%

Linux 个人使用配置

这里简单做一个个人向的 Linux 使用配置吧,无论是 Ubuntu 还是 CentOS,都可以使用这个配置来提升使用体验,以及工作效率。

*Photo by Arian Darvishi on Unsplash

前言

为什么会有这个,因为在实验室服务器上多个节点都有账户,然后 OS 也不相同,有 Ubuntu,有 CentOS,最近还有 Fedora,但基本都能使用一套配置,但是由于前后时间个人使用风格(?)的不同导致不同的配置,比如以前我在 Ubuntu 上会将一些个人的配置或者 alias 直接写入 .bashrc,后面则会新建一个 .myrc 配置文件,最近又将配置和 alias 分开,将配置写入 .bashrc,而将 alias 写入 .bash_aliases,总之就是很混乱,且没有统一,所以有了这篇文章。

统一配置

由于我一般都会安装 zsh 来提升使用体验(在博客搜索 “zsh” 就能找到那篇安装 oh-my-zsh 的文章),所以跟 Bash 还是稍微有点区别,但是总的来说他们都有一个配置文件:.bashrc/.zshrc 所以我们就有了一个算是统一的入口。

前几天我还整理了一篇常用的 alias 的文章(搜索 “alias”),并建议保存为 .bash_aliases,现在我觉得为了统一还是不这么做,为了统一起见,将其保存为 .myrc 并且将个人配置也放入其中,然后只需要在 .bashrc 和/或 .zshrc 加入 source .myrc 即可,需要备份的话直接保存 .myrc 就完事了。

配置哪些东西

.myrc 里面可以放哪些东西?老实说,可以放的东西很多,最常用的莫过于常用的 alias,另外就是登录时想运行的脚本,比如 remove_duplicate_cmds.py (见文末)这个去除冗余的历史命令。再比如设置一些环境变量,如下所示:

1
2
3
export LC_ALL=en_US.UTF-8
export PROJECT=/home/tian/my-python3-project
export MAKEFLAGS="-j$(nproc)"

总之,可以将任何想配置的命令放入 .myrc 这个文件,而且一旦完成好一份使用效果很棒的配置,以后可以直接 copy 过去,再在 .bashrc/.zshrc 加入一行命令就完了,所以就很方便。

附录

  • remove_duplicate_cmds.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Date : 2020-09-21 11:26:59
# @Author : Lewis Tian (taseikyo@gmail.com)
# @Link : github.com/taseikyo
# @Version : python3.8

"""
bash 和 zsh 会记录重复命令 于是有了这个脚本来
去除 .zsh_history/.bash_history 中的重复命令

为了保持顺序 使用 set 和list

若想每次自动去重 可以将脚本放入 ~/.bashrc 中:

tian@node:~$ chmod +x ./remove_duplicate_cmds.py
tian@node:~$ echo "/home/tian/remove_duplicate_cmds.py" >> .bashrc
"""

import os
import time
from datetime import datetime

BASH_HISTORY_PATH = "/home/chtian/.bash_history"
ZSH_HISTORY_PATH = "/home/chtian/.zsh_history"
# 定义一个时间阈值 避免每次切换/登录都要跑一遍
THRESHOLD_SECONDS = 3600


def cal_time(stamp):
"""
计算 stamp 到当前时间的间隔秒数
"""
t1 = datetime.utcfromtimestamp(time.time())
t2 = datetime.utcfromtimestamp(stamp)
return (t1 - t2).seconds


def bash_history():
"""
我之前记得 bash 是不记录重复命令的啊
难道我记忆错乱了?
"""
table = set()
cmds = []
cnt = 0
# 如果修改时间小于时间阈值则不管
if cal_time(os.path.getmtime(BASH_HISTORY_PATH)) < THRESHOLD_SECONDS:
return

with open(BASH_HISTORY_PATH, encoding="utf-8") as f:
for cmd in f:
cnt += 1
if cmd in table:
continue
table.add(cmd)
cmds.append(cmd)
# print("".join(cmds))
print(f"{BASH_HISTORY_PATH} {cnt} -> {len(cmds)}")
with open(BASH_HISTORY_PATH, "w", encoding="utf-8") as f:
f.write("".join(cmds))


def zsh_history():
"""
由于 zsh 会在命令前面加入时间戳
所以需要一个 split 的操作
"""
table = set()
cmds = []
cnt = 0
# 如果修改时间小于时间阈值则不管
if cal_time(os.path.getmtime(ZSH_HISTORY_PATH)) < THRESHOLD_SECONDS:
return
with open(ZSH_HISTORY_PATH, encoding="utf-8") as f:
for cmd in f:
cnt += 1
purge_cmd = "".join(cmd.split(":")[2:])
if purge_cmd in table:
continue
table.add(purge_cmd)
cmds.append(cmd)
# print("".join(cmds))
print(f"{ZSH_HISTORY_PATH} {cnt} -> {len(cmds)}")
with open(ZSH_HISTORY_PATH, "w", encoding="utf-8") as f:
f.write("".join(cmds))


def main():
"""
如果想加其他的 xsh 也可以
直接参考上面的写法
"""
bash_history()
zsh_history()


if __name__ == "__main__":
main()

Welcome to my other publishing channels