2024-12-26 13:45:07
Shell脚本我们经常会使用,平时自己折腾Nas会用到,工作中为了配置CI会用到,自己的电脑上最近为了配置自己的命令行环境也要使用shell来进行配置。不过之前的shell功力都来自每次使用的时候网上搜索,于是最近就找了一本《Linux命令行与shell脚本编程大全》看了看,看完之后更加感受到Shell的强大,特地写个文章来分享一下。
首先呢,shell它也是一种语言,不过因为使用到的shell环境不同语法会有一些差异,在Linux上我们常用的shell是Bash,在Mac上面常用的shell为zsh,大体的语法相似的。编程语言的基本要素,Shell都是支持的,它支持变量,支持if判断,case选择,循环等结构化的编程逻辑控制,也支持基本的算数运算,同时还支持使用函数来复用代码。 简单介绍一下它的语法,首先是变量。系统为我们已经提供了很多的变量,同时在我们的配置文件中定义的那些变量也是可以读取到的。定义变量语法如下:
|
|
以上方式定义的变量默认是全局的,比如你在一个函数中定义的,外面也能访问,这是时候可以定义局部变量:
|
|
除了普通的变量之外,shell中也是支持数组和Map的,当然要bash 4.0以上才能完整支持,使用如下:
|
|
而如果只是有这些东西的话,还不至于说Shell强大。而shell中可以直接调用命令以及Linux中的一些程序这才是它的强大之处。在python等其他语言中我们也是可以调用的,但是是都需要通过语言的系统调用才能调用,而shell中则是可以直接调用那些命令,只要这些程序的可执行文件在PATH环境变量中就可以。
而配合Shell的很多特性,又进一步强大了。第一大神器是重定向,重定向支持重定向输入和重定向输出,以下为一些示例:
|
|
因为有了输入输出重定向,我们会有很多的玩法,可以方便的命令的输入写入到我们的文件中,而linux系统中,万物皆为文件,因此理论上可以写入或者读取所有东西。比如,有一个Null设备,我们可以通过以下的命令,来不展示任何运行输出。
|
|
1为标准输出,2为错误输出,未指定的时候默认是把标准输出重定向,这里重定向到null则不会有任何输出,而第一行我们将错误输出又通过&绑定到了标准输出。当然除了这个还有更多的用法。
除了重定向之外的另一大特性则是 管道 。在某些场景重定向已经可以解决了很多功能,但是管道实现会更优雅。管道可以将前一个命令的输出直接传给另一个命令,并且管道的串联没有数量的限制,并且前一个命令产生输出就会传递到第二个命令,不用使用缓冲区或者文件。比如:
|
|
甚至我们还可以将刚刚的输出继续重定向保存到文件
|
|
在很多命令的参数之类的都提供了正则表达式的支持,正则表达式能够让我们更加方便的进行数据匹配,Linux中常用正则为POSIX正则表达式,而它又有两种,基础正则表达式(BRE)和扩展正则表达式(ERE),大部分的Linux/Unix工具都支持BRE引擎规范,仅仅通过BRE就能完成大部分的文本过滤了,但是ERE提供了更强的功能,而有些工具为了速度,也仅仅实现了BRE的部分功能。
BRE支持的语法符号包括,.
匹配任意一个字符,[]
字符集匹配,[^]
字符集否定匹配,^
匹配开始位置, $
匹配结束位置,()
子表达式,*
任意次数量匹配(0次或多次),而ERE在BRE的基础上,还支持?
最多一次匹配,+
匹配至少一次。而它们的更多功能可以参看这篇文章:https://en.wikibooks.org/wiki/Regular_Expressions/POSIX_Basic_Regular_Expressions。
有了正则表达式以及许多的处理工具我们就可以做很多的事情了,比如说查找文件,我们可以使用find
,查找某个文件夹下面为指定后缀的文件:
|
|
而配合管道,又可以对find之后的结果进行进一步的处理,比如配合上grep
可以进一步对文件的内容进行过滤。
|
|
对于文本的处理,Linux中又有sed和awk两大杀器,而关于他们的使用已经可以被写成书了。sed全名为Stream editor,也就是流编辑器,通过它可以方便的查找文件内容并替换后输出,awk则是一种模式匹配和文字处理语言,通过他们可以方便的处理文本。比如说我们可以使用sed对一份CSV文件中的手机号码进行打码处理:
|
|
以上关于命令的介绍只是抛砖引玉,关于他们的使用,我们的电脑中已经给我们提供了详细的介绍,只需要在命令行中输入man commandname
就可以了,除此之外,很多的命令也也提供了简单的帮助,只需要输入commandname help
, command --help
之类的就可以看到。
如果仅仅是语言层面的功能的话,shell相比python是没什么优势的,但是它能够和其他的命令无缝的使用,并且被Mac,Linux,Unix内置可直接使用也是它的一大优势。此外我们还可以通过shell脚本来增强我们的Linux终端,比如说可以定义自己的函数,通过.bashrc
引用,可以在终端中直接调用方法名执行。
通过Shell,在Linux下面的体验得到很好的提升,工作效率也可以获得很大的提高,本文只是略微提到其皮毛,希望能够引起你对Shell的兴趣,如果想要更加深入的了解,还是需要去阅读手册或者书籍。
以下是推荐的一些资料可供参考:
2024-12-15 20:05:07
最近把电脑上面的Linux系统给重装了,同时呢也要配置新的MacBook,就整理了一个个人的dotfile,这里分享一下linux上的我主要使用的软件,以及我的dotfile内容。
dotfile
字面意思就是以.
开头的文件,在Linux当中就是隐藏文件,我们大家说的一般指的就是配置文件,比如shell的.bashrc
、.profile
文件等。我在整理自己的dotfile
的时候参考了一些网上大神的dotfile
文件,这里我主要是包含我的shell
的一些配置文件,vim
、git
、rime
相关的文件。
为了保持Linux和Mac系统的统一, 我将Linux的Shell也换成了zsh
,同时为了简单并没有使用oh-my-zsh
,只是添加了一些自己常用的aliases
。
而Vim则使用neovim,它相当于是重新开发的,我想比vim应该代码上面更加高效,毕竟少了很多的历史包袱。另外它的配置文件可以使用Lua进行编写,而不是使用vim script,这样也是它的一大优点。
除了配置之外,还增加了脚本用用于将这些配置文件自动拷贝到对应的目录,使用以下代码判断是Linux系统还是Mac系统:
|
|
另外呢,对于Mac系统,在初始化脚本中还添加了homebrew的安装,并且通过使用Brewfile
在定义需要安装的一些软件,这样在执行brew bundle
的时候可以把这些软件都安装上去。
对于Linux的目前还没做啥,都是通过自己手动安装的,不过一些操作也记录到了shell文件当中了。
既然写了文章,就顺便分享一下我的Linux上面还在用的软件吧。 首先是Shell,为了跟Mac保持统一,也改用了zsh,如果你也想要设置zsh为你的默认shell,可以执行如下命令并重启(前提你已经安装的zsh):
|
|
编辑器目前在用的有三款,主要在用neovim,同时代码文件还会使用vscode
,因为有些场景neovim操作比较麻烦(对于快捷键不太熟悉),最近也在使用阮一峰老师之前推荐过的zed,据说比vscode性能更高,目前体验是对于很多语言的支持是已经内置了,不需要在安装插件,这点是好评的。
输入法在使用Fcitx5,输入方案则是使用了Rime,Rime的配置则是参考了雾凇拼音,而我主要使用小鹤双拼。
其他还在使用的软件包括:
项目开发: Android studio
截图软件:Flameshot
启动器: ULauncher, 使用简单,支持的插件数量也比较多
文档搜索: Zeal doc,mac 上面dash的window和linux平台开源版本,支持dash的文档。
文件同步: Syncthing
局域网文件传输: LocalSend
聊天软件: Weixin, telegram
文档和博客编辑: Obsidian
网页浏览器: Edge
我的电脑已经有32G的内存了,大部分时候是够用的,但是编译Android系统的时候就不够用了。因此需要想办法,一种方式是弄一个swap空间,但是swap的速度不是很快,经过查询资料了解到现在linux已经有了一种新的虚拟内存技术,也就是zram,它主要功能是虚拟内存压缩,它是通过在RAM中压缩设备的分页,避免在磁盘分页,从而提高性能。
而想要启用它其实很简单,在我们的Ubuntu中,只需要首先关闭原先的swap空间,编辑/etc/fstab
文件,将其中的swapfile条目注释掉。之后调用如下命令:
|
|
如果你本来就没有设置swap,那就不需要做上面的操作,直接安装zram-config
:
|
|
之后可以调用如下命令验证:
|
|
我们在系统监控里面也能看到,不过还是swap。
以上方式开启的zram为物理内存的一半大小,当然也是可以修改的。
修改/usr/bin/init-zram-swapping
文件中的mem大小即可。
如果对于我的dotfile感兴趣,可以查看我的repo, 地址为: https://github.com/sangmingming/dotfiles,其中我提到的初始化脚本为script/bootstrap
文件。
2024-12-11 22:21:26
月初跟朋友约着一起去了一趟四明山和奉化蜘蛛岭,因为相机的照片和拍的视频一直没整理,内容也就拖着没有发,正好这两日不太忙,就整理一下。
首先驾车来到了四明湖,四明湖水杉观赏区人特别多,车不太好停。水杉树有一点红的,跟网上的图片比还差一点,晚一两周来估计会更好看。
相机只有个35mm镜头,远处好看的红杉都拍不了,还是要升级装备。 除了杉树旁边还有很多芦苇也很好看。
看完红杉在镇上吃了个面,遂驱车进山,一路上人是真的多,每一个观景台都堵车,也有交警维持秩序,因此观景台就没法停下来观看了。
因为晚上的住宿定在了溪口,随后就继续开车前往溪口了。在路上看到了红枫之乡,风景很不错,就拐了个弯进去,几个人顺着小路爬到了山上。
(以上三张照片有手机拍的和相机拍的,可以猜猜)。枫叶很多已经掉了,村民告诉我们前两周特别好看,那个时候过来看枫叶的人很多。
晚上饭后,趁着给车充电的时间,在溪口转了转,这边的建设真不错。房子的灰色的民国风的建筑,这边又有山有水空气很好。
早上早早吃完饭,就开车前往直岱村委会,停了车开始徒步。总长度大约8公里多,因为带着小孩走的很慢。
一路上倒是风景很多样,有普通的树,有枫树,有竹林。
路上遇到两个水潭,而且作为当地村民的引用水源的,潭水碧绿。
最高峰黄泥浆岗976米。
走到村口大树就能看到我们停车的停车场了,也就完成了这个环线。 这一路上有很多的徒步团的标记,完全不用担心迷路。为了方便记录也可以使用两步路来找别人的记录跟着走,如下是我的记录:
为了轻装上阵,相机也没拿,徒步的所有的图片就用手机拍摄了。同时徒步过程中又拿着运动相机拍了一些视频,剪辑如下:
最后回到溪口镇上,吃了个饭,就返程了,结束一个充实的周末。
2024-11-29 22:32:03
十一月也到了尾声,这个月真的是跌宕起伏,首先见证了同学的新婚大喜,听闻了川普的胜选,错过了比特币的大涨,当然也有突然到来的被裁员,和就业环境的寒意。虽然如此,还是出去玩了几趟,看了一些书。
公司状况不太好有一段时间了,我们这段时间的需求也不大多,特朗普刚刚竞选结束,技术Leader就跟我们说要裁员,随后HR火速走流程,也就两三天电脑就锁了,进入失业状态。
复习了一周后就开始投简历了,首先找朋友内推和脉脉聊投了几家大厂。由于年龄不小,学校也非重点院校,加上最近这一两段的工作经历又比较杂,真的是Buff叠满,意料中的这几家都没通过简历筛选。
而后跟朋友聊天,他们目前所在的公司在人员招聘方面也不容乐观,一方面是公司的经营状态其实也都没有那么好,另一方面公司也都卡薪资卡年龄。所幸的是,裁员大礼包支撑几个月是不成问题的,这个时候能做的就是调整好心态,慢慢去找,不要那么的焦虑。
月初回安徽参加大学室友的婚礼,绕道合肥一起去母校转了一圈,合肥这几年的变化挺大的。
学校除了改了名称,其他方面感觉变化倒是不大,最大感受就是学校里面的电瓶车真的是很多。
十月份的时候跟朋友约了几次出去爬山,但是因为一到周末就刮风下雨,不断的被延后,这个月终于成行了。在月中,和朋友一起分别带着各自的小朋友,前往苏州旺山,这条线路倒是不太累,总长度只有不到9公里。
虽然预报没有雨,但是当天还是下着小雨。但总体不耽误我们徒步爬山,旺山上面的徒步团也挺多的。这里离太湖不远,风景也还不错,山里有座乾元寺庙,去其中拜拜佛,保佑找点早到工作。
而上周末天气也是很不错,于是跑到了之前很多人推荐的号称小塞尔达的神仙湖公园转了转。这个湖为坑矿改造,湖水碧绿,湖中间有小的起伏可以走过去,过去转转挺不错,就是开车过去要两个小时体验不太好。
这个月周末出去的比例和之前相比还更高了,因为失业所以基本整天呆在家里,因此到周末还是要出去多走走看看。
这个月看了几集的《守护解放西5》,其中的案件真的挺有意思的,作为下饭榨菜挺不错,其中的一些案件呢也是能够了解到警官办案的辛苦和嫌疑人的无厘头。
上个月开始看的《原则》终于看完了,看完之后发现这本书还有对应的实践书,也找到看了看不过还没看完。另外达利欧还基于他的书做了一个介绍原则的视频,这个视频用30分钟的介绍了他的原则,以及他的走向成功的五步骤法。
马伯庸今年的新书《食南之徒》也花了几天看完了,因为内容很精彩,所以看的很快。按照马亲王在书尾的介绍,这是根据真实历史事件,去展开,扩充成为一本涉及到南越国王死亡真相的悬疑小说,而其中有穿插了很多关于美食的描写,让人读的酣畅淋漓。
前几天提过一本《鱼不存在》也是在孟岩播客推荐之后看的,这本书的题材和叙事方式都很神奇,之前写过文章,这里再多说了。
因为要找工作的原因,这个月跟不少朋友或者微信或者线下聊天,感觉比我这半年跟别人聊的还多。聊了之后也还是感觉整体的行情不好,需要做好长期奋战的准备了。
而所在的几个微信群里,裁员的也不是我一个,其他群友也有被裁的。这个时候所有人都应该调整心态,说不清过完年一切会好一点呢。
每日的复习和刷题其实还是挺难坚持下去的,而余下的时间还是要多看书,有空了出去走走,以及多跟别人交流。
共勉之。
2024-11-21 16:13:07
最近把本地的Android源码升级到了最新的Android 15,用于看Android源码的Android Studio for Platform也升级到了最新版本,Google的Cuttlefish最近发布了1.0版本,也顺便折腾了一下使用Cuttlefish来运行自己编译的Android系统,这里就介绍一下如何使用和遇到的问题。
Cuttlefish是谷歌推出的一种可以配置的虚拟Android设备,它可以运行在我们本地设备上,也可以运行在服务器上面,官方也提供了Docker运行的支持,理论上可以运行在本地或者服务器的Debian设备上,或者运行在Google Compute Engine上。
用官方的化来说,它是一个更接近真实设备的Android模拟器,除了硬件抽象层(HAL)之外,它和实体设备的功能表现基本上是一致的。使用它来做CTS测试,持续集成测试会有更高的保真度。
在命令行中运行它,是没有类似模拟器的UI的,我们可以通过两种方式看到它的UI,一种是通过ADB连接,另一种则是开启它的webrtc功能,在浏览器中查看和交互。而他的虚拟硬件功能,可以让我们模拟多个屏幕,测试蓝牙wifi等各种功能。
首先我们需要检查我们的设备是否支持KVM虚拟化,使用下面的命令:
|
|
如果得到一个非0的值,就是支持的。
之后我们需要有一个Android固件,可以选择去Android持续集成网站下载他们编译好的固件,也可以自己编译固件。下载固件要注意下载设备目标中带cf的,并且下载的目标CPU需要和需要运行的宿主机CPU架构一样,ARM就下载ARM的,X86就下载X86_64的,具体的操作可以看官方教程。我这里则是自己编译,使用如下代码设备我要编译的选项:
|
|
这样有了固件,还是不能够运行的。我们还需要去编译Cuttlefish,在https://github.com/google/android-cuttlefish下载源码后,在cuttlefish源码目录下执行如下代码编译和Android:
|
|
如果你很幸运的化,上面会一次成功,但是我不是个幸运儿。于是了类似如下的错误:
|
|
这个错误的原因呢,就是因为编译cuttlefish的时候使用了bazel这个构建工具,它依赖JDK,而我没有设置JAVA_HOME
这个环境变量,因此把它加入到环境变量中就好了。类似如下:
export JAVA_HOME=/usr/lib/jvm/zulu-17-amd64
设置完成之后在Cuttlefish项目目录用如下命令检查一下,看看JAVA_HOME是否设置正确:
|
|
但是搞完之后,在安装这两个deb文件的时候又遇到了问题,告诉我我电脑上的grub-common
签名有错误,这个呢是因为我之前添加了铜豌豆的软件源,grub升级的时候升级了铜豌豆的grub软件包,它和ubuntu官方的不同,于是卸载掉铜豌豆软件源,grub-common也重新安装,之后就没问题了。
这些做完之后,我们执行下面的命令设置环境,并且重启电脑就好了。
|
|
在我们的已经编译完Android系统目录中首先执行如下代码让环境初始化好:
|
|
随后执行如下的命令就可以启动Cuttlefish运行Android了:
|
|
如果你是从Android官方下载的,那么会和我这有一些区别,可以去看一下官方教程。
这个时候我们就可以通过adb看看设备是否已经启动了,也可以在浏览器中打开,在本机浏览其打开使用如下地址和端口:
https://localhost:8443/
地址一定要使用https,点击左侧的swtich按钮就可以看到UI了。 webrtc是默认打开的,关于它的命令行更多使用方式可以查看官方文档,可以使用如下的命令查看。
|
|
而关闭Cuttlefish,也很简单,使用如下的命令:
|
|
2023版本的Android Studio for Platform(以下简称Asfp)在打开的时候是有一个单独的Open Aosp project
选项的,而新版本的这个选项去掉了。刚刚使用它的时候我还一脸懵逼,测试了Import和Open都不行,结果最后发现新版的New
选项就直接是导入Aosp工程了。
使用方式如下图。
我们可以根据上图选择我们需要导入的Module,选择Asfp给我们生成的项目文件存放的位置,之后Asfp会执行lunch
的操作和它需要的一些依赖构建。在我们选定的目录下面也会生成一个asfp-config.json
文件,它就是我们的项目设置,如果我们以后有变化了(比如想看不同的模块的代码),也可以直接修改这个文件。
|
|
参考内容和资料:
2024-11-19 23:40:52
最近因为孟岩在无人知晓播客中推荐了鱼不存在这本书,于是在微信读书中把它很快给读完了。
书不长,挺快就看完了。作者露露·米勒因为自己出轨和男友分手,自己的生活一团糟,所以她才开始研究起大卫·斯塔尔·乔丹。
从书的前半部分我知道了大卫是一名分类学家,同时还是斯坦福大学的首任校长。他的一生在追求建立秩序,小的时候他研究植物的分类,长大了开始研究鱼的分类,给鱼命名。经历了地震之后,他顽强的恢复,并通过用针把鱼和铭牌缝到一起来恢复秩序。
而书的后半部分,则转到了大卫的另一面,他推崇优生学,参与推动美国把优生绝育写到法律当中,作者崇拜的大卫完全变成了另一个人,而这要比希特勒的纳粹理论还要早,并且给纳粹提供了理论。而很多人因为大卫倡导的优生理论被进行绝育或者被歧视,作者访问了其中的两位。而大卫本人却获得了成功的一生。 到书的最后,作者又发现了鱼这个分类被最新的支序分类学判定为不存在,如果这么说的话,大卫的工作是否就不存在了。 书中穿插着对于大卫的描述,也包含了作者自己生活的描述,以及她对于大卫痕迹的追寻。
世界是无序和混沌的,我们每个人都很渺小,大卫用他的力量去构建他认为的秩序,而这也是他做很多事情的动力。做为个体的我们需要接受自己的渺小和日常的混沌。
以下为内容摘抄:
◆ 科学价值与美学趣味不同,前者的特质之一就是关注隐秘角落里微不足道的事物。
◆ 生命没有意义,无所谓意义
◆ 混乱是我们唯一的统治者。
◆ 这就是大卫·斯塔尔·乔丹吸引我的原因。我想知道,是什么驱使他不断举起缝衣针修补世界的混乱,罔顾所有告诫他不会成功的警示。他是否偶然发现了一些技巧,一剂充满希望的解药,用以消除世界的漠然?他是个科学家,所以他的坚持不懈背后也许有什么东西,能够与爸爸的世界观契合,我紧紧抓住这一丝微弱的可能性。或许他发现了关键:如何在毫无希望的世界里拥有希望,如何在黑暗的日子里继续前行,如何在没有上帝支持的时候坚持信念。
◆ 那是舌尖上的蜜糖、无所不能的幻想、秩序带来的愉悦感
◆ 科学世界观的问题在于,当你用它来探寻生活的意义时,它只会告诉你一件事:徒劳无功。
◆ “由此观之,生命何等壮丽恢宏。”
◆ 不可摧毁之物与乐观毫无关系,相反,它比乐观更深刻,处于意识的更深处。不可摧毁之物是我们用各种符号、希望和抱负粉饰的东西,并不要求我们看清它真实的模样。
◆ 学会换一种方式看待发生在自己身上的事情之后,那些经历创伤的人能够更快获得内心的平静。
◆ 我们行走在人世间,心里明白这个世界根本不在意我们的死活,不管我们如何努力,都不一定能够成功。
◆ 我们时刻在同数十亿人竞争,在自然灾害面前毫无还手之力,而我们热爱的每一件事物最终都会走向毁灭的结局
◆ 其中最重要的特质就是遭遇挫折后继续前进的能力,即便没有任何证据显示你的目标有可能实现,你也能不断地奋勇向前
◆ 在混乱的旋涡中,那残酷无情的真相昭然若揭:你无关紧要。
◆ 从星辰、永恒或优生学视角下的完美状态来看,一个人的生命似乎无关紧要,我们不过是一颗微粒上的一颗微粒上的一颗微粒,转瞬即逝。但这也只是无尽观点中的一个观点而已。在弗吉尼亚州林奇堡的一套公寓里,一个看似无关紧要的人会变得意义重大。她是替身母亲,是欢笑之源,她支撑着另一个人度过最黑暗的时光。
◆ 鱼不存在,“鱼类”并不存在。这个对大卫至关重要的分类,他陷入困境之时寻求慰藉的种类,他穷尽一生想看清的物种,根本不存在。
◆ 我们对周围的世界知之甚少,即便对脚边最简单的事物也缺乏了解。我们曾经犯过错,之后还会继续犯错。真正的发展之路并非由确定无疑铺就,而是由疑问筑成,因此需要保持“接受更正”的状态。
关于我的读后感,自认为写的不好,这本书的题材很吸引人,内容既有科普,又有关于大卫的传记,又有关于人生意义和哲理的思考,感兴趣还是要自己去读一读这本书。
最后附上孟岩这期播客的地址:https://www.xiaoyuzhoufm.com/episode/6720836fbad346ebe6399017