初识Shell&Shell脚本&MacOS权限

2,388 阅读5分钟

我们在iOS开发的时候很少关注ShellMacOS的权限问题,但是说起来Shell我们也是经常使用的,比如我们终端输入ls,会列举出当前目录下的所有文件夹和文件,其实ls就是一条Shell指令。

1、什么是Shell?

对于图形界面,用户只需要点击图标即可启动某个软件;对于命令行,输入某个程序的名字(可以看做一个命令)启动某个程序。所以图形界面和命令行要达到的目的是一样的,都是让用户控制计算机。

然而,真正能够控制计算的硬件(CPU、内存、显示器等)的只有操作系统内核(Kernel),图形界面和命令行只是架设在用户和内核之间的一座桥梁。

由于安全、复杂、繁琐的原因,不能让用户直接接触内核(也没有必要),需要另外再开发一个程序,让用户直接使用这个程序;该程序的作用就是接收用户的操作(点击图标、输入命令),并进行简单的处理,然后再传递给内核,这样用户就能间接地使用操作系统内核了。

为了既能简化用户的操作,又能保障内核的安全,就需要在用户和内核之间增加一层“代理”,而开发的用户界面和命令行程序就是这层“代理”。在 Unix或Linux 下,这个命令行程序就叫做 Shell

2、Shell的种类有哪些?

Shell的种类有很多种,在我们MacOS操作系统上默认的是bash

我们可以查看一下当前MacOS有多少种Shell。 打开终端,进入 /private/etc,然后当前文件夹下有一个叫做ShellsShells里面存储了我们当前Mac电脑的操作系统里拥有的Shell种类。zsh是目前比较流行的且更友好的Shell,有兴趣的课可以装一装。

Shells

3、Shell的使用

这里使用2个简单的例子

  • 新建一个文件夹
  • 在新建的文件夹里面新建一个文件

新建一个文件夹,终端输入:mkdir 代码

创建文件夹

新建一个文件,终端输入:touch appShell.sh

新建文件

4、Shell脚本的介绍和使用

Shell脚本 也就是用各类命令预先放入到一个文本文件中,方便一次性执行的一个脚本文件。

我们把刚才的指令放到Shell脚本中

Shell脚本

执行脚本bash appShell.sh

执行脚本

同理我们可以用其他的Shell执行,比如:

  • ksh appShell.sh
  • zsh appShell.sh(我电脑安装的zsh

我们也可以使用source appShell.sh执行。

注意:source 后路径变了

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的多用户多任务优点,所以UnixLinux多被用于服务器。

如下图中显示,明显的能看到Unix(Linux)的多用户和Windows的一个用户访问区别。

Windows
Unix(Lunix)

稍微了解一下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
[   权限    ]  [连接]  [所有者]      [所属组]  [文件大小]       [最后修改日期]        [文件名称]

上方第一列就是权限,接下来依次是连接数,文件所有者、所属组,文件大小、最后修改时间和文件名称,下图说明了,文件类型和权限:

权限说明.png

那么我们上方使用的chmod 755 appShell.sh是怎么来的呢?

我们在iOS开发的时候经常能看到类似于下方这种的枚举,代表二进制往前移动几位,这是为了我们能一次使用多个枚举,比如UIRectCornerTopLeftUIRectCornerTopRight同时使用。

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种都添加。

改变权限.png

以上就是对Shell&Shell脚本&MacOS权限的一些简单介绍了,对于我的日常也是够用了。