Shell是一个用C语言编写的程序,是用户使用Linux的桥梁。既是一种命令语言,又是一种程序设计语言。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。文件名是这样的 XXX.sh
Linux 的 Shell 种类众多,常见的有:
Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
Shell for Root(/sbin/sh)
Bash Shell(也就是 Bourne Again Shell )在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell。
在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash。
( #!/bin/bash是放在脚本文件的第一行,是指此脚本使用/bin/bash来解释执行,#!是特殊的表示符,其后面根的是此解释此脚本的shell的路径。同理也可以放#!/usr/bin/python)
系统启动什么样的shell程序取决于个人的用户ID配置。
在/etc/passwd文件中,在用户ID记录的第7个字段中列出了默认的shell程序。只要用户登录到某个虚拟控制台终端或是在GUI中启动终端仿真器,默认的shell程序就会开始运行。
用于登录某个虚拟控制器终端或在GUI中运行终端仿真器时所启动的默认的交互shell,是一个父shell。
在CLI提示符后输入/bin/bash命令或其他等效的bash命令时,会创建一个新的shell程序。这个shell程序被称为子shell(child shell)。
ps --forest命令展示了这些子shell间的嵌套结构。
bash shell程序可使用命令行参数修改shell启动方式。
可以输入man bash或bash --help获得关于bash命令的更多帮助信息。
用exit命令退出子shell
命令列表:在命令之间加入分号(;)可以在一行中指定shell要依次运行的一系列命令。
进程列表:是一种命令分组(command grouping)。将命令列表命令包含在括号里,生成
一个子shell来执行对应的命令。
可以借助一个使用了环境变量的命令echo $BASH_SUBSHELL知道是否生成了子shell。如果该命令返回0,就表明没有子shell。如果返回1或者其他更大的数字,就表明存在子shell


后台模式:运行命令可以在处理命令的同时让出CLI,以供他用。要想将命令置入后台模式,可以在命令末尾加上字符&。
将sleep放入后台后,可以使用ps命令用来显示各种进程,也可以使用jobs命令来显示后台作业信息。一旦后台作业完成,就会显示出结束状态。
将进程列表置入后台模式。你既可以在子shell中进行繁重的处理工作,同时也不会让子shell的I/O受制于终端。
(60s后,再按回车键,显示后台运行的sleep命令已经运行完成)
协程命令:coproc可以同时做两件事。它在后台生成一个子shell,并在这个子shell中执行命令coproc命令给进程起的默认名字为COPROC通过使用扩展语法,可以修改协程的名字。
coproc My_Job { sleep 10; }
但扩展语法必须确保在第一个花括号({)和命令名之间有一个空格。还必须保证命令以分号(;)结尾。另外,分号和闭花括号(})之间也得有一个空格。
命令分为shell的内建命令和外部命令。
非内建(外部)命令:有时候也被称为文件系统命令,是存在于bash shell之外的程序。它们并不是shell程序的一部分。外部命令程序通常位于/bin、/usr/bin、/sbin或/usr/sbin中。
ps就是一个外部命令。你可以使用which和type命令找到它。
当外部命令执行时,会创建出一个子进程。这种操作被称为衍生(forking)。外部命令ps很方便显示出它的父进程以及自己所对应的衍生子进程。
当进程必须执行衍生操作时,它需要花费时间和精力来设置新子进程的环境。
内建命令:已经和shell编译成了一体,作为shell工具的组成部分存在。不需要借助外部程序文件来运行,不需要使用子进程来执行。内建命令的执行速度要更快,效率也更高。
cd和exit命令都内建于bash shell。
echo和pwd既有内建命令也有外部命令。两种实现略有不同。要查看命令的不同实现,使用type -a。which命令只显示出了外部命令文件。
内建命令history 会跟踪你用过的命令。你可以唤回这些命令并重新使用。
命令历史记录被保存在隐藏文件.bash_history中,它位于用户的主目录中。这里要注意的是,
bash命令的历史记录是先存放在内存中,当shell退出时才被写入到历史文件中。

输入!!,然后按回车键就能够唤出刚刚用过的那条命令来使用。
输入!命令编号,然后按回车键就能够唤出history中对应编号的命令。
当shell退出时命令的history才被写入到.bash_history中?
我们可以直接用tail命令查看.bash_history文件和history命令二者的区别。
.bash_history的末尾几行是上次退出shell时的命令;而history的末尾是我们实时输入过的命令。
同时,我们可以在退出she11会话之前将命令历史记录(history)强制写入.bash history文件。要实现强制写入,需要使用history命令的-a选项。
发现强制写入后, .bash history就与history一致了。
内建命令alias(别名)允许你为常用的命令(及其参数)创建另一个名称,从而减轻你的代码输入量。
alias –p 命令可以查看你所使用的Linux发行版已经为你设置好的一些常用命令的别名
(--color ,表明终端支持彩色模式的列表;一般来说,ll和ls –al命令显示的结果是一样的)
使用alias命令创建属于自己的别名。
比如说:alias li='ls –li'
命令别名属于内部命令,一个别名仅在它所被定义的shell进程中才有效。(就是说我们在自己用户下的别名,不影响其他用户的别名。因为不是同一个shell)
3523

被折叠的 条评论
为什么被折叠?



