sh、bash和zsh区别

2020-11-04 16:27:05

简介

Shell是一种脚本语言,是用户使用Linux的桥梁,要让这些脚本语言run起来,就必须要有解释器来执行这些脚本。而sh、bash、zsh就是脚本解释器,习惯上把它们陈祚一种shell,我们常说有多少种shell,其实说的就是shell脚本解释器。

sh

Bourne Shell,是一个早期的重要shell,1978年由史蒂夫·伯恩编写,并同Version 7 Unix一起发布。

bash

Bourne-Again Shell,是一个为GNU计划编写的Unix shell。1987年由布莱恩·福克斯创造。主要目标是与POSIX标准保持一致,同时兼顾对sh的兼容,是各种Linux发行版标准配置的Shell,在Linux系统上/bin/sh往往是指向/bin/bash的符号链接。

zsh

也称为Z shell,是Bourne Shell(sh)的扩展版本,具有大量新功能,并支持插件和主题。 由于它基于与Bash相同的shell,因此ZSH具有许多相同的功能,并且切换是轻而易举的。

区别

1.sh是bash的一种特殊模式,sh就是开启了POSIX标准的bash,/bin/sh 相当于 /bin/bash --posix。形象一点的描述就是sh遵循POSIX规范:当某行代码出错时,不继续往下解释,bash就算出错,也会继续向下执行。
2.zsh比bash更强大,功能也更加完善,但是配置比较复杂,导致流行度不是很高。但是有优秀的oh-my-zsh加持导致这个事情变得更加的容易。

Go json裁剪

背景 项目中遇到一个使用场景:服务端要保存用户上传的json格式示例,但是服务端针对这个json格式示例有大小限制,比如1KB,超过这个大小后服务端就不能正常保存了。此时用户正好手里有个比较大(>1KB)的json示例,他要想将这个示例正常保存可以进行两种不同操作: 手动去裁剪这个json字符串; 通过智能的方式自动将一些重复且不必要的数据删除掉,以达到json裁剪的目的 显然,针对第一种方式不太明智,那我们如果采用第二种方式的话,又该怎么做呢? 操刀 在Go里面,我们引用官方标准库encoding/json对json进行序列化和反序列化时用的最多的也是下面的两个方法: func Unmarshal(data []byte, v interface{}) error func Marshal(v interface{}) ([]byte, error) 注意里面的入参interface类型参数,第一个是将data里面数据反序列化到v中,第二个是将v中参数序列化成json字符串。而我们json格式对象常用的格式基本上都是下面这两种类型的: [ xxx,xxx,... ] 和 { xxx:ooo,... } 我们正好可以分别用[]interface{}表示数组和map[string]interface{}表示大对象,

Serverless 无服务

由于Serverless近几年的流行,网上相关介绍文档已经介绍的比较详细了,比如:https://www.alibabacloud.com/zh/knowledge/what-is-serverless (from 阿里云)里面就从概念、优势、主要使用场景等都做了介绍,有需要可以直接点击链接去看看。 最近正好又从腾讯云的公众号上看到一个关于Serverless的视频,感觉又能从另一个角度去讲解Serverless到底能干什么,挺有意思的,特此记录一下:(视频from https://mpvideo.qpic.cn/0bf2buaa2aaa3uamhqudibpvadodbugqadia.f10002.mp4?dis_k=be70851fc63b2818ae0f788a6922becb&dis_t=1605103756&vid=wxv_1558291465271836673&format_id=10002) 视频我起码看了好几遍,核心时候的就一点减轻运维压力