/bin/sh、/bin/bash到底有什么区别?POSIX解决什么问题?

       在之前的几篇Linux用户、用户组的博文中,我介绍了如何来创建用户,其中创建用户时我们可以在可选项上加上-s来为用户指定登录shell。也由此引出关于sh、bash的思考,前面也提及到了shell分很多种(其实是shell编译器分很多种),有sh(Bounce Shell)、csh(C shell)、Korn Shell、bash(Bounce Again Shell)等等。
       shell 作为一种脚本语言,需要相应的shell编译器进行编译。从编译器的性能来说,各有优缺点,sh是UNIX的标准编译器,它具备极好的编译性能,很适合我们进行shell编程,但是它与用户的交互不太好;而csh、Korn Shell等具备极好的用户交互性,但编译性能不如sh;bash是目前Linux采用的一款标准的编译器,向后兼容sh,它自身集合sh、ksh等编译器的优点,不仅很适合进行shell编程,同时又具备良好的用户交互,如命令补全、命令转发等优秀交互性能。(PS:由于bash本身比较复杂,在一些Linux的发行版本中,如Ubunto将其进行了缩减,改为dash,并让/bin/sh指向它。)
       那么我们在Linux系统中用sh、bash编译shell脚本到底有什么区别呢?

sh xxx.sh
bash xxx.sh

       #!bin/sh、#!bin/bash(#!就是制定shell编译器种类)一般是放在shell脚本的首行,用来指定该段脚本采用的shell编译器。
(本文注重原理阐释,我就不举例说明了)
       首先统一说一下,你用sh编译指向的是bash,你用bash调用指向的仍然是bash,只不过啊一个是开启了POSIX模式的bash、一个是未开启POSIX模式的bash。
       用bash去编译的结果一般和你预想的结果一致,因为bash本身就是Linux通用标准;当你用sh去编译可能会产生一些意向不到的编译结果,这也是POSIX的影响。

which sh
ls –l /bin/sh

在这里插入图片描述
开启了POSIX模式

which bash
ls -l /bin/bash

在这里插入图片描述
未开启POSIX模式

使用#!/bin/sh 等价于 #!/bin/bash -开启posix模式


说了这么多,其实要弄清楚两者的区别,关键是要了解POSIX是什么,它的作用是什么?
       创作不易,接下来的部分主要参照了这篇博文(https://blog.csdn.net/weixin_40039738/article/details/81867577)

       POSIX(Portable Operating System Interface,可移植操作系统接口),是操作系统为应用程序提供的接口标准。
       简单的说,它主要是解决了应用程序在各个操作系统上兼容性这样一个普遍存在的问题。只要一个应用程序的开发是为了在一个实现了POSIX模式的操作系统上运行,那么这个应用程序就可以在所用实现了POSIX模式的操作系统上运行。
       我们结合例子更深入的理解下
       例如创建进程,linux下是fork函数,windows下是creatprocess函数。好,我现在在linux下写一个程序,用到fork函数,那么这个程序该怎么往windows上移植?我需要把源代码里的fork通通改成creatprocess,然后重新编译…
       posix标准的出现就是为了解决这个问题。linux和windows都要实现基本的posix标准,linux把fork函数封装成posix_fork(随便说的),windows把creatprocess函数也封装成posix_fork,都声明在unistd.h里。这样,程序员编写普通应用时候,只用包含unistd.h,调用posix_fork函数,程序就在源代码级别可移植了。

你可能感兴趣的:(Linux相关)