1. 什么是shell?
- shell是一个程序,充当用户界面和脚本解释器,允许用户输入命令以及间接地访问内核的服务。
- shell是一个命令处理器,一个读取并解释所有输入命令的程序。
shell脚本
由shell解释的程序
11.2 Bourne shell家族:sh、ksh (Korn shell)、bash、zsh
11.3. C-shell家族:csh、tcsh
C-shell 和Tcsh不像Bourne家族那样擅于编程。尽管语法类C,但是不适合编写shell脚本。因此C-shell和Tcsh有许多设计缺陷。
T是Tenex系统的简称
11.5 临时改变shell
当登录系统时,系统会自动启动一个shell。这个shell是
shell就是一个程序,可以像其它程序一样运行。这意味着任何时候,都可以停止当前的shell,并
tcsh
#当前shell(bash)暂停,新shell(Tcsh)启动
^D # 切换回bash
cat /etc/shells #查看系统中支持的所有shell
echo $SHELL 查看当前shell
11.6 口令文件,改变登录shell:chsh
/etc/passwd包含登录shell名称,因此改变登录shell,所需要的工作就是对/etc/passwd进行一个简单的修改。但是该修改不能直接进行。这样做太危险了,因为破坏/etc/passwd会严重破坏系统
chsh [-s shell] [userid]
$cat /etc/shells
/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
#为本登录用户更改登录shell
chsh -s /bin/tcsh
#管理员为xiaochao账号更改登录shell
chsh -s /bin/tcsh xiaochao
chsh -l #list shells 等同于cat /etc/shells
12.1交互式shell和非交互式shell
交互式shell:与人进行沟通的shell
非交互式shell:独立于人运行的shell(shell脚本)
12.2 环境、进程和变量
在Unix系统中,每个对象都被表示成一个文件或进程。简单地讲,文件存放数据或访问资源,而进程是正在执行的程序。因此,一个正在运行的shell就 是一个进程,同理,任何从shell中启动的程序也是一个进程。
在进程运行的过程中,它需要访问所谓的,即一组用来存放信息的变量。
变量:用来存储数据的实体
变量名:引用变量的标识符
值:存储变量中数据
变量命名规则:大小字母(A-Z)、小写字母(a-z)、数字(0-9)或下划线构成,且第一个字符必须是字母或下划线,不能是数字
数据类型:字符串,没有赋值则为null
子进程继承父进程的环境
shell启动了一个vi程序
父进程:shell
子进程:vi
在子进程创建时,系统为子进程复制了父进程的环境,我们说子进程继承了父进程的环境。这意味着父进程可以访问的所有环境变量子进程都可以访问。
12.3 环境变量和shell变量
:可以在程序的任何地方使用。环境变量对进程可用,所以它们是全局变量。
:只在特定的shell中使用,并不属于环境,因此这些变量不从父进程传递给子进程,基于这一原因,我们村这种变量为局部变量。
通常局部(shell)变量有2种:
- eg: c-shell 的ignoreeof变量来确定shell在用户按下^D的时候是否忽略eof信号
- shell脚本中的局部变量,临时存储器。
名称命名规则:
- c-shell : 环境变量大写,shell变量小写
- Bourne shell:环境变量和shell变量都大写
Bourne shell家族中,,也就是说,每个新变量被自动地设置为shell变量。如果希望某个变量同时成为环境变量,必须使用export命令。
#创建shell变量
XIAOCHAO=cool
#将shell变量变为 “shell + 环境”变量
export XIAOCHAO
$echo $XIAOCHAO
一些变量在shell中和所有子进程中都有意义。Bourne Shell家族通过使用避免了这一问题。但是C-shell不允许这样做。
面对这样的问题,,这些变量分别绑定对应环境变量,无论何时,当这些变量改变时,shell会自动地更新对应的变量。
shell 变量 | 环境变量 | 含义 |
---|---|---|
cwd | PWD | 当前工作目录 |
home | HOME | home目录 |
path | PATH | 搜索程序的目录 |
term | TERM | 正在使用的终端类型 |
user | USER | 当前用户标识 |
12.4 显示环境变量:env、printenv
12.5 显示shell变量:set
不带选项和参数:显示所有的shell变量,此命令适用于所有shell。
对于Bourne shell家族来说,shell变量都是大写字母的名称,因此只看变量名称无法确定这个变量是局部变量还是全局变量。唯一分辨的方法是env命令和set命令的结果进行对比
Bourne shell家族不怎么使用shell变量,C-shell家族大量使用shell变量。
控制shell行为
C-Shell使用shell变量
Bourne shell使用shell选项
12.6 显示及使用变量的值:echo、print
$ echo ${VAR_NAME}
#如果没有歧义,可以省略大括号{}
$ echo $VAR_NAME
$ echo the terminal type is $TERM
the terminal type is xterm-256color
#多个变量同时打印
$ echo $TERM $HOME $PATH $SHELL
#相邻字符不分开
$ echo "My favorite sport is ${ACTIVITY}ing"
My favorite sport is runing
print : Korn Shell
$ ksh
$ print $TERM
xterm-256color
$ echo $TERM
xterm-256color
12.7 Bourne Shell家族使用变量:export、unset
的语法:NAME=value
XIAOCHAO=smart
XIAOYI="more smart"
#一条命令导出多条变量
export XIAOCHAO XIAOYI
#分步骤
XIAOCHAO=smart; export XIAOCHAO
#同时创建shell变量和导出环境变量
export XIAOCHAO=smart
#多个变量同时赋值,同时设置为shell变量和环境变量
export XIAOCHAO=smart XIAOYI="more smart"
当创建变量时,我们称这是在,当删除变量时,我们称这是
unset *NAME...*
12.8 C-Shell 家族使用变量:setenv、unsetenv、set、unset
C-Shell在环境变量和shell变量之间有一个清晰的界限。明确区分全局变量和局部变量。
setenv NAME [value]
setenv PATH /usr/local/bin:/usr/bin:/bin
setenv XIAOCHAO cool
setenv XIAOYI "a cool girl"
setenv NULLVALUE
复位环境变量:unsetenv NAME
unsetenv XIAOCHAO
unsetenv XIAOYI NULLVALUE
- 设置和复位shell变量
set name [=value]
unset variable
set term=vt100
#C-Shell中用()将字符串扩起来,而不是双引号:""
set path=(/usr/bin /bin /usr/ucb)
#设置空值,存在即忽略eof📶,要求用户使用logout结束shell
set ignoreeof
unset igonoreeof
set xiaochao=cool
set xiaochao
unset xiaochao
12.9 shell选项:set -o set +o
- shell是交互式的还是非交互式的是由shell选项控制的
- shell支持一个叫“作业控制”的功能,运行后台运行程序。打开作业控制需要运行monitor选项,关闭作业控制需要抚慰monitor选项。默认情况下,交互式的shell中monitor选项是打开的。
两种设置方式:
# 第一种,命令行选项方式
ksh -m #启动一个ksh 设置(打开)monitor选项
#第二种:set命令的变体 option是长名称
set -o option # 设置选项
set +o option # 复位选项
set -o monitor
set +o monitor
shell | 选项 | 长名称 | 含义 |
---|---|---|---|
B K | -a | allexport | 导出随后定义的所有变量和函数 |
B . | -B | allexport | 启用括号拓展(生成字符模式) |
B K | -E | emacs | 命令行编辑器:EMACS模式,关闭vi模式 |
B K | -h | hashall | 查找命令时(记住)命令的哈希位置 |
B . | -H | histexpand | 历史列表启用!风格替换 |
B . | history | 历史列表:启用 | |
B K | -I | ignoreeof | 忽略eof信号^D;使用exit退出shell |
. K | mkdirs | 在通配时,在目录名中追加/ | |
B K | -m | monitor | 作业控制:启用 |
B K | -C | noclobber | 不允许重定向的输出替换某个文件 |
. K | nolog | 历史列表:不保存函数定义 | |
B K | -b | notify | 作业控制:当后台作业结束时立即通知 |
B K | trackall | 别名:为命令替换完整路径名 | |
B K | -V | vi | 命令行编辑器:vi 模式,关闭Emacs模式 |
. K | viraw | vi模式:立即处理每个键入的字符 |
注意:bash支持emacs和vi选项,但是它不使用-E和-V
除了上面表中说明的选项外,还有许多其他的shell选项,这些选项大多在非交互式的shell中有用(也就是说当编写shell脚本时)。另外,如果使用的是bash,那么有一个特殊的命令,可以用来访问更多选项。
12.10 显示shell选项
set -o
set +o
set -o | less
set +o | less
set -o ignoreeof
set +o ignoreeof
#10次^D 后,才退出login shell
#设置如下shell变量来设置ignoreeof的次数
IGNOREEOF=20
除非你是高级用户,否则只需要关注ignoreeof、monitor、noclobber选项即可。
set用法总结
- 显示shell变量: set
- 创建shell变量
- 打开或关闭shell选项
- 显示shell选项
思考
环境变量并不是真正的全局变量,因为子进程对环境变量的修改并不能传递回父进程。
shell | 选项 | 长名称 | 含义 |
---|---|---|---|
B | -u | nounset | 忽略不存在的变量 |
B | -x | xtrace | 忽略不存在的变量 |
B | -e | errexit | 脚本只要发生错误,就终止执行 |
B | pipefail | 有一个例外情况,就是不适用于管道命令 |
参见:
Bash 脚本 set 命令教程
网友评论