共计 6680 个字符,预计需要花费 17 分钟才能阅读完成。
文章目录
Shell 介绍
Shell 品种
命令行环境
终端模拟器
命令行提示符
进入和退出办法
Shell 脚本
第一个 shell 脚本
Bash
Bash 如何解析命令
Shell 和 Bash 的历史
Shell 介绍
简略点了解,就是零碎跟计算机硬件交互时应用的两头介质,它只是零碎的一个工具。实际上,在 shell 和计算机硬件之间还有一层货色那就是零碎内核了。打个比方,如果把计算机硬件比作一个人的躯体,而零碎内核则是人的大脑,至于 shell,把它比作人的五官仿佛更加贴切些。回到计算机上来,用户间接面对的不是计算机硬件而是 shell,用户把指令通知 shell,而后 shell 再传输给零碎内核,接着内核再去摆布计算机硬件去执行各种操作。
Shell 是一个用 C 语言编写的程序,它是用户应用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面拜访操作系统内核的服务。
Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。
Shell 编程跟 JavaScript、php 编程一样,只有有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就能够了。
Shell 这个单词的原意是“外壳”,跟 kernel(内核)绝对应,比喻内核里面的一层,即用户跟内核交互的对话界面。
具体来说,Shell 这个词有多种含意。
首先,Shell 是一个程序,提供一个与用户对话的环境。这个环境只有一个命令提示符,让用户从键盘输入命令,所以又称为命令行环境(command line interface,简写为 CLI)。Shell 接管到用户输出的命令,将命令送入操作系统执行,并将后果返回给用户。本书中,除非特地指明,Shell 指的就是命令行环境。
其次,Shell 是一个命令解释器,解释用户输出的命令。它反对变量、条件判断、循环操作等语法,所以用户能够用 Shell 命令写出各种小程序,又称为脚本(script)。这些脚本都通过 Shell 的解释执行,而不通过编译。
最初,Shell 是一个工具箱,提供了各种小工具,供用户不便地应用操作系统的性能。
Shell 品种
Linux Shell 有很多种,只有能给用户提供命令行环境的程序,都能够看作是 Shell。
历史上,次要的 Shell 有上面这些。
Bourne Shell(sh)命令文件 /usr/bin/sh 或 /bin/sh
Bourne Again shell(bash)命令文件 /bin/bash
C Shell(csh)命令文件 /usr/bin/csh
TENEX C Shell(tcsh)
Korn shell(ksh)命令文件 /usr/bin/ksh
Z Shell(zsh)命令文件 /usr/bin/zsh
Friendly Interactive Shell(fish)
Shell for Root(/sbin/sh)
…
Bash 是目前最罕用的 Shell,除非特地指明,下文的 Shell 和 Bash 当作同义词应用,能够调换。
在个别状况下,人们并不辨别 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也能够改为 #!/bin/bash。
! 通知零碎其后门路所指定的程序即是解释此脚本文件的 Shell 程序。
上面的命令能够查看以后运行的 Shell:
$ echo $SHELL
/bin/bash
1
2
上面的命令能够查看以后的 Linux 零碎装置的所有 Shell。
$ cat /etc/shells
1
下面两个命令中,$ 是命令行环境的提示符,用户只须要输出提示符前面的内容。
Linux 容许每个用户应用不同的 Shell,用户的默认 Shell 个别都是 Bash,或者与 Bash 兼容。
命令行环境
终端模拟器
如果是不带有图形环境的 Linux 零碎(比方专用于服务器的零碎),启动后就间接是命令行环境。
不过,当初大部分的 Linux 发行版,尤其是针对普通用户的发行版,都是图形环境。用户登录零碎后,主动进入图形环境,须要本人启动终端模拟器,能力进入命令行环境。
所谓“终端模拟器”(terminal emulator)就是一个模仿命令行窗口的程序,让用户在一个窗口中应用命令行环境,并且提供各种附加性能,比方调整色彩、字体大小、行距等等。
不同 Linux 发行版(精确地说是不同的桌面环境)带有的终端程序是不一样的,比方 KDE 桌面环境的终端程序是 konsole,Gnome 桌面环境的终端程序是 gnome-terminal,用户也能够装置第三方的终端程序。所有终端程序,只管名字不同,基本功能都是一样的,就是让用户能够进入命令行环境,应用 Shell。
命令行提示符
进入命令行环境当前,用户会看到 Shell 的提示符。提示符往往是一串前缀,最初以一个美元符号 $ 结尾,用户能够在这个符号前面输出各种命令。
[user@hostname] $
1
下面例子中,残缺的提示符是[user@hostname] $,其中前缀是用户名(user)加上 @,再加主机名(hostname)。比方,用户名是 bill,主机名是 home-machine,前缀就是 bill@home-machine。
留神,根用户(root)的提示符,不以美元符号($)结尾,而以井号(#)结尾,用来揭示用户,当初具备根权限,能够执行各种操作,务必小心,不要呈现误操作。这个符号是能够本人定义的,详见《命令提示符》一章。
为了简洁,后文的命令行提示符都只应用 $ 示意。
进入和退出办法
进入命令行环境当前,个别就曾经关上 Bash 了。如果你的 Shell 不是 Bash,能够输出 bash 命令启动 Bash。
$ bash
1
退出 Bash 环境,能够应用 exit 命令,也能够同时按下 Ctrl + d。
$ exit
1
Bash 的根本用法就是在命令行输出各种命令,十分直观。作为练习,能够试着输出 pwd 命令。按下回车键,就会显示以后所在的目录。
$ pwd
/home/me
1
2
如果不小心输出了 pwe,会返回一个提醒,示意输出出错,没有对应的可执行程序。
$ pwe
bash: pwe:未找到命令
1
2
Shell 脚本
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
业界所说的 shell 通常都是指 shell 脚本,但读者敌人要晓得,shell 和 shell script 是两个不同的概念。
第一个 shell 脚本
关上文本编辑器(能够应用 vi/vim 命令来创立文件),新建一个文件 test.sh,扩大名为 sh(sh 代表 shell),扩展名并不影响脚本执行,见名知意就好,如果你用 php 写 shell 脚本,扩展名就用 php 好了。
输出一些代码,第一行个别是这样:
!/bin/bash
echo “Hello World !”
1
2
! 是一个约定的标记,它通知零碎这个脚本须要什么解释器来执行,即应用哪一种 Shell。
echo 命令用于向窗口输入文本。
运行 Shell 脚本有两种办法:
1、作为可执行程序
将下面的代码保留为 test.sh,并 cd 到相应目录:
chmod +x ./test.sh #使脚本具备执行权限
./test.sh #执行脚本
1
2
留神,肯定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,间接写 test.sh,linux 零碎会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 通知零碎说,就在当前目录找。
2、作为解释器参数
这种运行形式是,间接运行解释器,其参数就是 shell 脚本的文件名,如:
/bin/sh test.sh
/bin/php test.php
1
2
这种形式运行的脚本,不须要在第一行指定解释器信息,写了也没用。
Bash
Bash 是一个为 GNU 我的项目编写的 Unix shell。它的名字是一系列缩写:Bourne-Again SHell — 这是对于 Bourne shell(sh)的一个双关语(Bourne again / born again)。Bourne shell 是一个晚期的重要 shell,由 Stephen Bourne 在 1978 年前后编写,并同 Version 7 Unix 一起公布。bash 则在 1987 年由 Brian Fox 发明。在 1990 年,Chet Ramey 成为了次要的维护者。
bash 是大多数 Linux 零碎以及 Mac OS X v10.4 默认的 shell,它能运行于大多数 Unix 格调的操作系统之上,甚至被移植到了 Microsoft Windows 上的 Cygwin 零碎中,以实现 windows 的 POSIX 虚构接口。此外,它也被 DJGPP 我的项目移植到了 MS-DOS 上。
bash 的命令语法是 Bourne shell 命令语法的超集。数量宏大的 Bourne shell 脚本大多不经批改即能够在 bash 中执行,只有那些援用了 Bourne 非凡变量或应用了 Bourne 的内置命令的脚本才须要批改。bash 的命令语法很多来自 Korn shell (ksh) 和 C shell (csh),例如命令行编辑,命令历史,目录栈,$RANDOM 和 $PPID 变量,以及 POSIX 的命令置换语法:$(…)。作为一个交互式的 shell,按下 TAB 键即可主动补全已局部输出的程序名,文件名,变量名等等。
Bash 是 Unix 零碎和 Linux 零碎的一种 Shell(命令行环境),是目前绝大多数 Linux 发行版的默认 Shell。
Unix 中有两种次要的 shell 类别:
Bourne shell − If you are using a Bourne-type shell, the $ character is the default prompt.
C shell − If you are using a C-type shell, the % character is the default prompt.
linux 的公布版本之一——Redhat/CentOS——零碎默认装置的 shell 叫做 bash,即 Bourne Again Shell,它是 sh(Bourne Shell)的加强版本。Bourn Shell 是最早行起来的一个 shell,创始人叫 Steven Bourne,为了留念他所以叫做 Bourn Shell,检称 sh。那么这个 bash 有什么特点呢?
记录命令历史
咱们敲过的命令,linux 是会有记录的,预设能够记录 1000 条历史命令。这些命令保留在用户的家目录中的.bash_history 文件中。
指令和文件名补全
按 tab 键,它能够帮你补全一个指令,也能够帮你补全一个门路或者一个文件名。间断按两次 tab 键,零碎则会把所有的指令或者文件名都列出来。
别名
后面也呈现过 alias 的介绍,这个就是 bash 所特有的性能之一了。咱们能够通过 alias 把一个罕用的并且很长的指令别名一个简洁易记的指令。
通配符
在 bash 下,能够应用 * 来匹配零个或多个字符,而用? 匹配一个字符。
输入输出重定向
输出重定向用于扭转命令的输出,输入重定向用于扭转命令的输入。输入重定向更为罕用,它常常用于将命令的后果输出到文件中,而不是屏幕上。输出重定向的命令是 <,输入重定向的命令是 >,另外还有谬误重定向 2 >,以及追加重定向 >>。
管道符
后面曾经提过过管道符”|”,就是把后面的命令运行的后果丢给前面的命令。
作业控制
当运行一个过程时,你能够使它暂停(按 Ctrl+z),而后应用 fg 命令复原它,利用 bg 命令使他到后盾运行,你也能够使它终止(按 Ctrl+c)。
Bash 如何解析命令
按行读取命令
解决援用问题
双引号内的字符将失去其原有意义,除了 $, “ 和 \。
单引号内的字符将失去其原有意义,包含 $, “ 和 \。
将输出的一行字符串依照 ; 宰割成多个命令。
解决特殊字符
{..}, <(..), < …, <<< .., .. | .. 等特殊字符会被依照非凡的执行秩序解决。
重定向符号会被从命令行中移除,所以在执行命令时 … > log, 2>&1 这些命令都是不会提交给内核解决命令的过程的。
其余符号会被其对应的后果表白所代替,如 {..} 命令:
$ echo {a..c}
a b c
1
2
变量替换
将带 $ 符号的变量 $parameter 替换成变量内容,术语叫 Parameter Expansion.
$ echo $PWD
/z/ros
1
2
将命令行宰割成被执行命令和参数
宰割的准则是任何空白(空格、Tab)都将作为分隔符将一整条命令宰割成一个一个的词。宰割后后果的第一个词作为命令,其余词作为参数。如果命令词中蕴含空白,须要用引号括起来。
$ My Command /foo/bar ## This will execute the command named ‘My’ because it is the first word.
$ “My Command” /foo/bar ## This will execute the command named ‘My Command’ because the space inside the quotes has lost its special meaning allowing it to split words.
1
2
Tips: 在从 Windows 或 MacOS 将文件复制到 Linux 时,有些文件的文件名可能蕴含 Linux 不反对的特殊字符,如空格,# 等,如文件名 file 1127.txt 在 Windows 下是非法的,然而在 Linux 不非法,删除这个文件的命令:
$ rm file 1127.txt // not work
$ rm “file 1127.txt” // work
1
2
执行命令
a. 如果命令是 function or builtin,该命令将会被接管命令的同一个 Bash process 解决。
b. 否则 (像是 hadoop fs 等命令), Bash 将会 fork off,发明一个新的 Bash 子过程,将解析好的命令传递给它,并期待它返回后果。个别状况下,子过程将会继承父过程的规范流。
Shell 和 Bash 的历史
Shell 随同着 Unix 零碎的诞生而诞生。
1969 年,Ken Thompson 和 Dennis Ritchie 开发了第一版的 Unix。
1971 年,Ken Thompson 编写了最后的 Shell,称为 Thompson shell,程序名是 sh,不便用户应用 Unix。
1973 年至 1975 年间,John R. Mashey 扩大了最后的 Thompson shell,增加了编程性能,使得 Shell 成为一种编程语言。这个版本的 Shell 称为 Mashey shell。
1976 年,Stephen Bourne 联合 Mashey shell 的性能,重写一个新的 Shell,称为 Bourne shell。
1978 年,加州大学伯克利分校的 Bill Joy 开发了 C shell,为 Shell 提供 C 语言的语法,程序名是 csh。它是第一个真正代替 sh 的 UNIX shell,被合并到 Berkeley UNIX 的 2BSD 版本中。
1979 年,UNIX 第七版公布,内置了 Bourne Shell,导致它成为 Unix 的默认 Shell。留神,Thompson shell、Mashey shell 和 Bourne shell 都是贝尔实验室的产品,程序名都是 sh。对于用户来说,它们是同一个货色,只是底层代码不同而已。
1983 年,David Korn 开发了 Korn shell,程序名是 ksh。
1985 年,Richard Stallman 成立了自由软件基金会(FSF),因为 Shell 的版权属于贝尔公司,所以他决定写一个自在版权的、应用 GNU 许可证的 Shell 程序,防止 Unix 的版权争议。
1988 年,自由软件基金会的第一个付薪程序员 Brian Fox 写了一个 Shell,性能基本上是 Bourne shell 的克隆,叫做 Bourne-Again SHell,简称 Bash,程序名为 bash,任何人都能够收费应用。起初,它逐步成为 Linux 零碎的规范 Shell。
1989 年,Bash 公布 1.0 版。
1996 年,Bash 公布 2.0 版。
2004 年,Bash 公布 3.0 版。
2009 年,Bash 公布 4.0 版。
2019 年,Bash 公布 5.0 版。
用户能够通过 bash 命令的 –version 参数或者环境变量 $BASH_VERSION,查看本机的 Bash 版本。
$ bash –version
GNU bash,版本 5.0.3(1)-release (x86_64-pc-linux-gnu)
或者
$ echo $BASH_VERSION
5.0.3(1)-release
参考链接:
2 ways to check bash version