Day 02 :zsh 与 shell script

我把从第一天到现在每天的 Home 目录都放上 GitHub 了,README.md 里面有说明
这是今天的 Release https://github.com/simba-fs/2021-ironman-example/releases/tag/day02


今天内容不小心写太长了 ......

首先,在介绍其他软件之前,先来看看与 CLI 操作习习相关的「shell」,我选择的 shell 是 zshzshbash 的基础上扩充了很多实用的功能,像是支援更好的自动补全各式各样的主题等等。

zsh

安装

如果你的作业系统是 debian 系列的话,可以直接用 apt 安装 apt install zsh。其他的 linux 发行版可以到 这个网页找找你的发行版
如果是 mac,理论上你的 shell 应该已经是 zsh 了( mac 的 shell 从 2019 开始预设是 zsh ),如果不是的话你可以用 homebrew 安装 brew install zsh
如果是 windows 的话,建议你开启 WSL2 或是找一台有 linux/mac 的电脑

现在我们可以透过这个指令检查是否安装成功

zsh --version

如果没有错误就是安装成功了

❓ > 现在用的是什麽 shell?
你可以使用 echo $SHELL 来看你现在使用的 shell 是那一个

更换 shell

如果你之前的 shell 不是 zsh 那就要更换预设 shell,用以下指令可以更换

chsh -s $(which zsh)
或是 
chsh -s $(where zsh)

初次使用 zsh

更换完 shell,重新开启终端机,你应该会看到类似下面的画面,我们选择预设的 (0) 选项就可以了。如果没有出现这个画面的话就是预设的 shell 没有切换成功或是之前你*已经用过 zsh 了。

zsh-install
zsh 安装画面

zplug

装好 zsh 後,你会发现他和 bash 或是你原本的 shell 没什麽差别,甚至更难用,那是因为我们还没设定。zplug 是一个 zsh 的套件管理器,所有的设定都写在 .zshrc 里,因此如果以後要换电脑,只需要搬走 .zshrc 一个档案,zplug 就会帮你把所有外挂装起来。

安装 zplug

官方建议的安装方式是使用 installer,执行以下指令

$ curl -sL --proto-redir -all,https https://raw.githubusercontent.com/zplug/installer/master/installer.zsh | zsh

如果出现 Enjoy zplug! 就是安装完成了,如果没有的话可能是版本不对,他会告诉你有什麽没装

zshrc

现在我们要来设定 ~/.zshrc 了,这是 zsh 的设定档,他其实就是一个 shell script,但是每次启动 zsh 他会先被执行
首先随便用一个编辑器打开 ~/.zshrc,删掉里面所有内容(应改只有一行注解),贴上以下内容

source ~/.zplug/init.zsh

# plugins

if ! zplug check --verbose; then
	printf "Install? [y/N]: "
	if read -q; then
		echo; zplug install
	fi
fi

zplug load

第一行是启动 zplug
第五行开始是检查是否要更新/安装套件

重新开启终端机,这样环境才会载入

基本 shell sript

接下来,我们先来认识一下 shell script,这个东西不仅可以让你操作更加顺畅,也可以帮你实现各种自动化操作

命令

一个普通的 shell 通常是以一个命令开头,例如 lscdmv,这个命令代表的是电脑中一个可执行档,你可以用 which <cmd>where <cmd> 来看执行档的路径。在这个命令後面的东西都是参数,和一般程序不一样的是,这个参数因为是整个字串交给命令处理,所以通常可以不管顺序,,例如 ls -a -lls -l -a 是一样的(当然会有例外或是处理的不好的情况,但不多),更棒的是大部分成熟的指令都可以让这种只有一个字元的「短选项」合起来写,变成这样 ls -al

Pipe

一个复杂的指令不太可能只凭几个短短的选项运作,例如 grep(搜寻特定字串用的命令) 除了可以在选项指定档名,也可以过「特殊的方式」传一串字给他,这个方法就是我们熟悉的 stdin,也就是 scanfcin 这类函数接受输入的来源。
接受 stdin 的方式有两个,一个是使用者自己打,另一个是接受另一个命令的「输出」。要接受另一个「输出」的方式叫做 pipe,顾名思义就是「管线」,他可以把 A 指令的输出接给 B 指令的输入。例如以下的命令

$ ps -ax | grep zsh

先用 ps 指令列出所有的 process,再交给 grep 找出含有字串 zsh 的行。

Redirect

刚刚讲了把输出转到另一个命令的输入,那如果是要写进档案里面呢?是不是个命令叫 write?其实 shell 已经有个东西可以写档案了,就是 redirect,直接来看范例

写档

$ ls > ls_output.txt

就这麽简单,用大於符号 > 就可以把标准输出( stdout )丢到档案里面,但是要注意的是这样写的话是直接**「覆盖」,有就是说如果原本 ls_output.txt 有内容,会直接被 ls 指令的输入覆盖,如果你想保留,可以用 >>「附加」**,这会让他接在档案最後面

读档

如果某个指令没有读档案的选项,只接受 stdin,那你也可以用 redirect 将档案读进这个命令

$ wc < .zshrc

wc 这个指令会计算输入的行数/字数/字元数,上面的指令先把 .zshrc 读出来,再交给 wc 计算字数

关於其他 pipe 和 redirect 的用法可以参考 这篇文章

嗯...我知道这有点蠢,因为你可以直接在 wc 後面接路径,这里只是示范一下

环境变数

改变命令行为的方式除了选项外,还有环境变数。环境变数就像 C++ 里的**「全域变数」,不管是哪个命令(函数)都可以读、写**。通常环境变数的功能是设定某个选项,好让每一次执行时不用加一堆选项(当然这个功能要命令有支援才行),或是储存某个命令的资讯,像是 $SHELL 纪录着你现在使用的 shell。

读取

读取环境变数很简单,只需要加上钱号 $ 就可以了,例如 $PATH(通常环境变数会全大写,但其实没有什麽规范), shell 会在读到这个的时候用他的值去替代这个字串。例如以下范例

ls $HOME

$HOME 的值是你的家目录路径,shell 解释出来的命令就会是 ls /home/username
如果你想要看这个环境变数的值,可以根据上面的原理,用 echo 命令印输出来

echo $HOME

写入

写入环境变数只有一个要点——不要加空白,用 = 指定环境变数时千万不要= 左右加上空白,看范例

A='a string'   # O
B= 'a string'  # X
C ='a string'  # X
D = 'a string' # X

其实 shell script 中的钱号 $ 还有超多用法,可以参考 这里

结尾

今天介绍了 zsh 和外挂管理器 zplug 还有一点点的 shell script,明天开始会用 zplug 装各种外挂来丰富我们的纯‧ CLI 整合式开发环境


<<:  从 React 开始,让你的网页material-ui起来 [Day 1] 受众&&环境

>>:  DAY01前言:有关30天挑战

iris的middleware

middleware 在上篇文章介绍routing时有提到Party时有传入一个handler不知道...

Day14 资料汇入和汇出

接下来我们来说明一下,在kibana要怎麽汇出和汇入查询资料?在实际的业务中,大家多少都有汇入、汇出...

予焦啦!RISC-V 的计时器中断机制

本节是以 Golang 上游 8854368cb076ea9a2b71c8b3c8f675a8e1...

ISO 27001 资讯安全管理系统 【解析】(九)

(一)正式范围定义的目的 范围定义的目的是准确说明组织所做的事情,范围说明应准确说明组织所做的事情是...

安全玻璃(Safety Glass)

尽管夹层玻璃比钢化玻璃更安全,但价格更高。尽管如此,法规要求仍可能会影响各国安全玻璃的安装。而且,作...