我们在iOS
开发的时候很少关注Shell
和MacOS
的权限问题,但是说起来Shell
我们也是经常使用的,比如我们终端输入ls
,会列举出当前目录下的所有文件夹和文件,其实ls
就是一条Shell
指令。
1、什么是Shell?
对于图形界面,用户只需要点击图标即可启动某个软件;对于命令行,输入某个程序的名字(可以看做一个命令)启动某个程序。所以图形界面和命令行要达到的目的是一样的,都是让用户控制计算机。
然而,真正能够控制计算的硬件(CPU、内存、显示器等
)的只有操作系统内核(Kernel
),图形界面和命令行只是架设在用户和内核之间的一座桥梁。
由于安全、复杂、繁琐的原因,不能让用户直接接触内核(也没有必要),需要另外再开发一个程序,让用户直接使用这个程序;该程序的作用就是接收用户的操作(点击图标、输入命令),并进行简单的处理,然后再传递给内核,这样用户就能间接地使用操作系统内核了。
为了既能简化用户的操作,又能保障内核的安全,就需要在用户和内核之间增加一层“代理”,而开发的用户界面和命令行程序就是这层“代理”。在Unix或Linux
下,这个命令行程序就叫做 Shell
。
2、Shell的种类有哪些?
Shell
的种类有很多种,在我们MacOS
操作系统上默认的是bash
。
我们可以查看一下当前MacOS
有多少种Shell
。
打开终端,进入 /private/etc
,然后当前文件夹下有一个叫做Shells
,Shells
里面存储了我们当前Mac
电脑的操作系统里拥有的Shell
种类。zsh
是目前比较流行的且更友好的Shell
,有兴趣的课可以装一装。
3、Shell的使用
这里使用2个简单的例子
- 新建一个文件夹
- 在新建的文件夹里面新建一个文件
新建一个文件夹,终端输入:mkdir 代码
新建一个文件,终端输入:touch appShell.sh
4、Shell脚本的介绍和使用
Shell脚本
也就是用各类命令预先放入到一个文本文件中,方便一次性执行的一个脚本文件。
我们把刚才的指令放到Shell
脚本中
执行脚本bash appShell.sh
同理我们可以用其他的Shell
执行,比如:
ksh appShell.sh
-
zsh appShell.sh
(我电脑安装的zsh
)
我们也可以使用source appShell.sh
执行。注意:source
后路径变了,
我们平常最常用的就是./appShell.sh
了,执行后发现没有权限,我们添加一个权限(权限下一条说)chmod 755 appShell.sh
,然后再执行./appShell.sh
脚本执行相关命令的区别
-
$source FileName
- 意思:在当前shell环境中读取并执行FileName中的命令
- 特点:
- 命令可以强行让一个脚本去立即影响当前的环境(一般用于加载配置文件)。
- 命令会强制执行脚本中的全部命令,而忽略文件的权限。
-
$bash FileName、zsh FileName
- 意思:重新建立一个子shell,在子shell中执行脚本里面的句子。
-
$./FileName
- 意思:读取并执行文件中的命令。但有一个前提,脚本文件需要有可执行权限。
5、MacOS权限的介绍和文件权限的修改
MacOS
是基于Unix
内核的图形化操作系统,而Unix
是多用户、多任务的系统,所以这样的系统里面就拥有了用户、组的概念,那么同样文件的权限也就有相应的所属用户和所属组了。
在Windows
上只要能进入系统硬盘上的所有东西都可以访问,由于Unix
的多用户多任务优点,所以Unix
和Linux
多被用于服务器。
如下图中显示,明显的能看到Unix(Linux)
的多用户和Windows
的一个用户访问区别。
稍微了解一下MacOS
系统,上条中./appShell.sh
的提示权限不足原来是我们当前登录的用户未拥有对appShell.sh
执行的权限。
好,我们查看一下文件权限,终端输入ls -l
,显示如下
tancheng@localhost ~/Documents/SecurityProducts/003-CodeSign应用重签名/代码/WeChatDemo : ls -l
total 8
drwxr-xr-x 3 tancheng staff 96 10 17 11:07 APP
drwxr-xr-x 13 tancheng staff 416 10 19 10:21 WeChatDemo
drwxr-xr-x 5 tancheng staff 160 10 19 10:50 WeChatDemo.xcodeproj
drwxr-xr-x 4 tancheng staff 128 10 19 10:02 WeChatDemoTests
drwxr-xr-x 4 tancheng staff 128 10 19 10:02 WeChatDemoUITests
-rw-r--r-- 1 tancheng staff 1979 10 19 10:40 appShell.sh
[ 权限 ] [连接] [所有者] [所属组] [文件大小] [最后修改日期] [文件名称]
上方第一列就是权限,接下来依次是连接数,文件所有者、所属组,文件大小、最后修改时间和文件名称,下图说明了,文件类型和权限:
那么我们上方使用的chmod 755 appShell.sh
是怎么来的呢?
我们在iOS
开发的时候经常能看到类似于下方这种的枚举,代表二进制往前移动几位,这是为了我们能一次使用多个枚举,比如UIRectCornerTopLeft
和UIRectCornerTopRight
同时使用。
typedef NS_OPTIONS(NSUInteger, UIRectCorner) {
UIRectCornerTopLeft = 1 << 0,
UIRectCornerTopRight = 1 << 1,
UIRectCornerBottomLeft = 1 << 2,
UIRectCornerBottomRight = 1 << 3,
UIRectCornerAllCorners = ~0UL
};
其实权限也是一样的,那么755
代表如下:
-
7
:第一组文件所有者权限 , 二进制为111
,表示可读、可写、可执行(rwx
) -
5
:第二组用户所在组其他用户权限,二进制为101
,表示可读、不可写、可执行(r-x
) -
5
:第三组非本组用户的权限,二进制为101
,表示可读、不可写、可执行(r-x
)
相应的我们也可以直接操作执行权限chmod a+x appShell.sh
去执行,下方图明确的介绍了改变权限的方法。u
所属用户,g
用户所属组,o
非本组用户的权限,a
以上3种都添加。
以上就是对Shell&Shell脚本&MacOS权限的一些简单介绍了,对于我的日常也是够用了。