📄 tlfc讲义7-9-10章.txt
字号:
第七章
SHELL使用指南
Shell的作用
Shells
Linux中都包括哪些shell
Shell是一个可以从终端输入行读入并执行命令的程序解释器
Shell也是一种编程语言
最早的shell出现在unix系统中,是Bourne shell.----sh
在伯克利大学, Bill Joy 写了一个类似C语法的C shell.----csh
GNU Bourne-Again SHell (bash) 由自由软件基金组织创建,它向后兼容Bourne shell,是大多数linux厂商的首选----bash
还有一种扩展Extended C Shell (tcsh), 是C shell的一种克隆。--tcsh
korn shell----ksh
Shells
使用bash的原因
包含有高级程序语言的结构(if, while, select, etc.)
对文件和目录有强有力的支持
支持算术运算
开发程序快
交互式的命令历史机制模仿两个最流行的linux编辑器(vi and emacs)
支持函数
先进的模式匹配和分析复杂句子的能力
在所有现代的 Linux, UNIX, 各其他操作系统都可用。
在linux中是默认的shell
Shells
UNIX系统包括工具(utility)和内核(kernel)
关机后,kernel and utility 保存在硬盘中
开机后,kernel一直在内存,utility只有在执行时才载入内存,而且会在内存停留一段时间,所以短时间内第二次执行相同命令时,要快一些。
用户登录后shell要进行初始化
执行$HOME目录下的.profile,.bash_profile,/etc/profile等
初始化各种变量的定义,如TERM,PATH,MANPATH,PS1等
The Shell Environment
父进程和子进程
当我们登录的时候,就产生一个唯一进程PID=xx的shell,每当我们执行一个外部命令如vi,shell创建自己的挎贝作为子进程pid=yy,它的父进程为pid=xx,一旦新的命令被激活,它将替代子进程的shell pid=yy运行,一旦命令结束,子进程shell也结束,返回到父进程pid=xx.
The Shell Environment
Shell 环境
Shell受它的环境影响
每个程序都有一个自己的环境,以保持一定的环境定义
程序从它的父程序(调用程序)继承环境,在多数情况下,这个调用程序就是shell.
类似程序也可以把它的环境传递给调用它的任何其他程序,程序可以修改自己的环境,但这种情况不会影响到它的父环境。
子进程开始时,从父进程拷贝环境,之后父进程环境的改变不会影响到已运行的子进程
子进程中定义的变量都是局部变量,除非它通过export命令添加到环境中。export定义的变量也只会影响到自己及其子进程,不会影响到父进程。
The Shell Environment
Shell变量的定义
Shell有一个内置的变量处理机构
变量是用来保存可以被替换为命令行的字符串
变量名可以包含letters(字母), digits(数字), or underscore characters(下划线); 但必须以字母开头。
当shell替换命令行中的变量时,首先读取”$”后面的字母和数字以取得变量名。可以用大括号括起来。如
$ TEST=“test”
$ echo $TESTstring #shell认为变量名为TESTstring,所以取得错误的null值
$ echo ${TEST}string
teststring
当字符串含有空格,TAB,换行符等特殊字符时,用””括起来。
The Shell Environment
典型变量定义,在/home/user/.bash_profile中
JAVA_HOME=/root/bea/jdk141_02
CLASSPATH=/root/bea/jdk141_02/lib:/root/bea/jdk141_02/jre/lib:/opt/jakarta-tomcat-4.1.24/common/lib/servlet.jar:.
PATH=$PATH:/root/bea/jdk141_02/bin
export JAVA_HOME CLASSPATH PATH
通过export一次输出多个变量值。查看当前定义变量值可用命令
Env , declare, set 等命令查看
The Shell Environment
定义shell变量
标准的shell变量,用set可以查看
HOME Home directory
PWD Current working directory
OLDPWD Previous working directory
PATH Search command’s path
PS1 指定主提示符
PS2 指定次提示
HISTFILE 记录历史的文件名
HISTSIZE 记录历史命令数
ENV bash environment file
The Shell Environment
查找路径
Shell从PATH变量所指出的路径内查找命令
如果某个命令不在PATH变量所指定的路径内,命令将找不到
在PATH指定目录中第一个匹配的程序将被执行
圆点(.)代表当前路径
用type , which 命令可以查找某个命令所在的位置
$type vi
$which tty
Root用户的PATH设置在/etc/rc.d/rc.sysinit及/etc/profile 和/root/.bash_profile及/root/.bashrc中
The Shell Environment
Shell 提示符
Shell的提示符是一个变量
它可以包括机器名、设备名、当前路径等其他信息
Shell允许你自定义命令提示符
主要的提示符是 PS1变量
PS2用作shell提示符的附加提示符变量
PS1=‘[\u@\h \W]\$’
PS2=‘>>’
PS2作为一个二级提示符,该提示符指示前面行尚未结束,并且当 前行为前一行的续行
在bash中,$为普通用户提示符,#为超级用户提示符
The Shell Environment
环境文件
Shell环境依赖于多个文件的设置
当shell被调用时,它从两个初始文件读取命令:
/etc/profile ,它由root维护
普通用户的启动信息文件 ($HOME/.bash-profile)
Profile文件只有在用户登录的时候才运行
另一个典型配置文件是($HOME/.bashrc)
当系统管理员创建用户时,.bash_profile,.bashrc和其他公共环境文件模板在/etc/skel目录下。
The Shell Environment
/etc/profile:由管理员设置系统变量
$HOME/.bash_profile:实现用户特定的系统初始化
$HOME/.bashrc:若定义了系统变量ENV,且传递到环境中,所有的shell都要调用由ENV变量所指定的文件中所包含的命令。
注:前两个文件只在系统启动时被读取一次,而.bashrc文件在每次调用shell时都要读取。
The Shell Environment
环境文件
查看环境
可以使用set 或env 查看环境变量
set 列出所有环境变量
set -o 显示当前shell的选项
set -o option 使选项有效
set +o option 关掉某个选项
$ set -o vi 设置vi为命令行的编辑器
$ set -o allexport 自动传递所有新变量
$ set -o ignoreeof 禁止使用^D来退出shell,必须用logout命令来阻退出。
使用unset 命令可以取消环境变量的值
The Shell Environment
Shortcut Long Version
$ cd $ cd $HOME
$ cd - $ cd $OLDPWD
$ ls ~ $ ls $HOME
$ ls ~- $ ls $OLDPWD
$ ls ~+ $ ls $PWD
The Shell Environment
命令行扫描
When we type a command at the shell prompt, we can continue the line for as long as we want until we type the carriage-return character <CR>.
Once the shell receives the <CR>, it will parse the entire line.
Example:
$ abc=“/etc/”
$ ls –l $abc*.conf|more
提醒:可以使用TAB键让SHELL尝试完成文件名
The Shell Environment
Linux的通配符:
* 匹配任意个字符
? 匹配任意单个字符
[list] 匹配列表中的其中一个字母
[!list] 匹配除列表之外的任意一个字母
Example:
myfile[abcd] myfile[a-z]
myfile[a-dEFGD] myfile[!abcd] myfile[?*]
注:$set –o noglob 关闭文件名的产生
The Shell Environment
‘ 单引号可以屏蔽所有特殊字符
“ 双引号可以屏蔽多数特殊字符(但允许进行变量替换)
Example: echo *.conf
echo ‘*.conf’
echo “HOME”
echo “$HOME”
The Shell Environment
\ 反斜杠屏蔽后面字符的特殊含义。输入连续的命令行时可以用“反斜杠+回车”来断行,这个反斜杠告诉shell后面回车不是命令行结束标记
` 反引号,命令替换字符
echo “Current directory is `pwd`”
别名
一个例子:alias dir=ls
查看当前shell下所有别名的命令:alias
删除一个己有的别名用unalias命令
别名只用在当前的shell中,随着shell的结束而失效,但有一个办法可以解决这个问题。
可以把别名定义在三个环境文件中,通常情况下是写在个人的.bashrc文件中。
命令历史
shell的命令历史机制可以让我们在命令行中调出以前使用过的命令
!n 重复调用第n个历史命令
bash命令行编辑
set –o vi
set –o emacs
7.4 实用工具
7.4.1命令diff file1 file2
n1 a n3,n4 在file1的第一行之后加进了file2的第n3行至n4行
n1,n2 d n3 删除了原属于file1的第n1至n2行,(即file2的第n3行)
n1,n2 c n3,n4 file1的第n1至n2行变成了file2的n3至n4行
《行》,《行》 《命令》 《行》《行》
file1 file2
实用工具
设文件a内容为:
a
b
c
d
e
设文件b内容为:
c
d
e
f
g
实用工具
Diff命令产生如下输出:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -