1、交互式
上次提到,Shell有两种执行命令的方式:
交互式(Interactive),用户输入一条命令,Shell就解释执行一条;
批处理(Batch),用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令。
而我们举了一个例子001_HelloWorld.sh,就是第二种方式:批处理方式。
其实我们也可以用交互式来进行。比如我们在控制台输入:
echo "Hello World!"
一样可以得到:
$ echo "Hello World!"
Hello World!
之后的讲解中,为了方便说明清楚,我们会将二者结合使用。
2、#!/bin/bash、#!/bin/sh开头的意义
在我们的例子001_HelloWorld.sh中我们发现,第一行是
#!/bin/bash
如果将这一行去掉,我们用sh, bash, source, ./进行执行,结果没什么两样。那么这一行的意义是什么呢?
其实这句话的意思是告诉执行器需要调用/bin/bash来执行。如果有些用户使用的是csh,那么缺少第一行的“#!/bin/bash的shell脚本执行结果就可能存在语法不兼容的问题,导致结果异常或者根本不能执行。
3、bash和sh的区别
从我的Ubuntu16.04上可以看到:
$ ls -al /bin/sh
lrwxrwxrwx 1 root root 4 10月 7 08:14 /bin/sh -> dash
$ ls -al /bin/bash
-rwxr-xr-x 1 root root 1037528 7月 13 2019 /bin/bash
可见sh并不是指向bash,而是dash。
以下是网上搜到的答案:
GNU/Linux操作系统中的/bin/sh本是bash (Bourne-Again Shell) 的符号链接,但鉴于bash过于复杂,有人把bash从NetBSD移植到Linux并更名为dash (Debian Almquist Shell),并建议将/bin/sh指向它,以获得更快的脚本执行速度。Dash Shell 比Bash Shell小的多,符合POSIX标准。
所以也就是在Ubuntu中可以认为/bin/sh就是/bin/dash。
Ubuntu继承了Debian,所以从Ubuntu 6.10开始默认是Dash Shell。
/bin/sh与/bin/bash虽然大体上没什么区别,但仍存在不同的标准。标记为#!/bin/sh的脚本不应使用任何POSIX没有规定的特性 (如let等命令, 但#!/bin/bash可以)。Debian曾经采用/bin/bash更改/bin/dash,目的使用更少的磁盘空间、提供较少的功能、获取更快的速度。但是后来经过shell脚本测试存在运行问题。因为原先在bash shell下可以运行的shell script (shell 脚本),在/bin/sh下还是会出现一些意想不到的问题,不是100%的兼用。
说了这么多,估计有点晕了,我们到底该使用sh还是bash?我觉得不用过多纠结,不需要关注性能的我们,可以直接使用bash。
4、shell的type命令
type命令
type命令 用来显示指定命令的类型,判断给出的指令是内部指令还是外部指令。
命令类型:
alias: 别名
keyword: 关键字,Shell保留字
function: 函数,Shell函数
builtin: 内建命令,Shell内建命令
file: 文件,磁盘文件,外部命令
unfound: 未找到
语法:
tpye [选项] [参数]
选项:
-t: 输出"file"、"alias"或者 "builtin",分别表示给定的指令为:"外部指令"、"命令别名" 或者 "内部指令";
-p: 如果给出的指令为外部指令,则显示其绝对路径;
-a: 在环境变量“PATH”指定的路径中,显示给定指令的信息,包括命令别名。
参数:
指令:要显示类型的指令
在我的Ubuntu机器上运行:
$ type ls
ls is aliased to `ls --color=auto'
$ type cd
cd is a shell builtin
$ type type
type is a shell builtin
$ type mkdir
mkdir is hashed (/bin/mkdir)
至于mkdir是hashed,还不懂什么意思。稍后会详细确认并分享给大家。
好了,今天就到这里了,接下来的Shell脚本之旅会更精彩!
===================================================================================
注意:本文为本人原创,版权所属为个人所有,欢迎转载,但是转载请注明出处。
===================================================================================