shell, 进程, 变量, 命令, 作业控制
资料来源
(1) UNIX shell范例精解
1.什么是shell? shell的作用?
(1) shell是一种特殊的程序,是用户与UNIX/Linux系统内核之间的接口;
(2) shell用于解释并运行由命令行或脚本文件输入的命令,从而实现用户与内核间的交互; shell还可以用于定制用户环境,这通常在shell的初始化文件中完成,比如设置提示符、窗口属性、别名、内置变量等;
2.shell的种类,特点,默认提示符
注1:可以通过查看/etc/shell或/etc/shells文件了解自己所使用的linux有哪些版本的shell;
注2:通过echo $SHELL可以得知当前环境使用的是哪种shell;
注3:用户登录系统后,终端上显示的就是主提示符,以表明它正在等待用户键入命令并按下回车键;
注4:提示符包括主提示符%和次提示符?; 主提示符可以被重置(可以在.cshrc中重置它或者在shell提示符后设置它,其中.cshrc中重置会作用于当前shell和它的所有子shell,shell提示符后重置只会作用于当前登录会话框),但次提示符不能被重置;
示例: set prompt="$LOGNAME >"
注5:次提示符-挡直接在主提示符后编写脚本时,次提示符就会出现在屏幕上,并且持续出现直到该编程结构正常结束为止;
2.1 UNIX shell-Bourne shell (AT&T shell,标准的UNIX shell)
(1) shbang行: #!/bin/sh;
(2) 默认命令提示符: $;
2.2 UNIX shell-C shell (Berkeley shell)
(1) shbang行: #!/bin/csh;
(2) 默认命令提示符: %;
2.3 UNIX shell-Korn shell (ksh)
(1) shbang行: #!/bin/ksh;
(2) 默认命令提示符: $;
2.4 Linux shell-GNU bash (bash或Bourne Again shell)
(1) shbang行:#!/bin/bash;
(2) 默认命令提示符: $;
2.5 Linux shell-TC shell (tcsh)
(1) shbang行: #!/bin/tcsh;
(2) 默认命令提示符: >;
2.6 Linux shell-Z shell
2.7 Linux shell-Public Domain Korn shell (pdksh)
(2) 默认命令提示符: $;
3.shell历史
4.系统启动,登录shell,命令或程序退出状态
4.1 shell启动
(1) shell启动后,会先查找由系统管理员设置的系统级的初始化文件(C shell的启动文件时/etc/csh.cshrc和/etc/csh.login),然后在用户的主目录中查找是否存在对应的shell初始化文件(C/TC shell的用户主目录初始化文件分别为.cshrc和.tcshrc);如果存在,就会执行这些文件; 这些初始化文件用于进一步定制用户环境; 执行完.cshrc或.tcshrc文件中的命令以后,接下来会执行.login文件中的命令;
注1:每次启动一个新的C/TC shell, .cshrc或.tcshrc文件都会执行,而.login文件,它也包含用于初始化用户环境的命令和变量,但后者仅在用户登录时执行一次;
4.2 .cshrc文件与.tcshrc文件
if($?prompt) then set prompt = "\! stardust > " set history = 32 set savehist = 5 set noclobber set filec fignore = (.o) set cdpath = ( /home/jody/ellie/bin /usr/local/bin /usr/bin ) set ignoreeof alias m more alias status 'date; du -s' alias cd 'cd \!*; set prompt = "\! <$cwd>" '
注1:获取主机名-echo $HOSTNAME或者直接执行hostname;
注2:$?用于测试某个变量是否已被设置;
注3:set prompt=" \! stardust >"表示主提示符被设置为当前历史事件的数目(\!)、名字stardust和字符>,替换掉了默认的提示符;
注4:set prompt=" \! <$cwd>"表示主提示符被设置为当前历史事件的数目(\!)和用<>括着的当前工作目录$cwd;
set prompt="$HOSTNAME\[\!\]$cwd>"
4.3 搜索路径
(1) shell用变量path来定位用户在命令行键入的命令; 如果在路径中列出的所有目录和当前目录下均未发现要找的名ing,shell就会往标准错误输出发送一条信息: Command not found;
(2) C/TC shell中每条路径之间用空白符分隔:
set path=( /usr/bin /bin /usr . ) echo $path /usr/bin /bin /usr .
4.4 命令以及命令或程序退出状态,别名alias
(1) 命令与命令编组: 命令编组由多条命令组成,各条命令之间用;隔开,命令编组以换行符结束;
ls; pwd; cal 2022 ##cal 2022显示2022年日历;
(2) 命令和程序会在终止后,向父进程返回一个退出状态; 退出状态是一个0~255之间的整数; 程序退出时返回的状态是0,则说明命令执行成功; 退出状态非0,则说明命令因某种原因而运行失败;
grep "ellie" /etc/passwd echo $status
(3) 创建别名与删除别名;
注1:创建别名示例,alias cd 'cd ~; set prompt="$cwd >"';
注2:删除别名, unalias 别名;
5.进程与shell
注1:进程可以用唯一的PID号来标识,内核负责控制和管理进程;
5.1 哪些进程正在执行?
(1) ps aux (ps命令可用于查找PID号)
(2) pstree
5.2 创建进程
(1) 系统调用fork
(2) 系统调用wait
(3) 系统调用exec
(4) 系统调用exit
5.3 终止进程
(1) Ctrl+C
(2) kill (内置的shell命令,可以通过PID终止进程或通过作业号终止作业)
6.变量
(1) shell可以定义两类变量:局部变量和环境变量; 局部变量只属于创建它们的shell,不会传给该shell派生的任何子进程; 环境变量会被父进程传给子进程; 局部变量可以使用内置命令set显示,环境变量可以使用env命令显示;
(2) 局部变量可以通过set variable_name=value来创建,如set name="Tom"(用unset 变量名取消设置),环境变量可以通过setenv variable_name value来创建,如setenv PRINTER shakespeare(用unsetenv 变量名取消设置);
set name=Tonny echo $name unset name
setenv NAME=TONNY echo $NAME unsetenv NAME
(3) 可以使用echo $variable_name显示变量值;
7.作业控制
jobs 列出所有正在运行的作业 Ctrl+Z 中止或暂停作业,屏幕上将出现提示符(暂停的程序需要用户发出bg或fg命令才能恢复运行) bg 启动被中止的后台作业 fg 将后台作业调到前台 kill 向指定作业发送kill信号
注1:使用示例如jobs, fg %1, kill %2;
注2:作业调度与内置命令sched,sched允许创建一个作业列表,它们可以在指定的时间被调度执行,不带参数的sched命令,将显示所有调度事件的编号列表;
sched 14:30 echo 'Time to start your lecture' sched 5PM echo 'Time to go home' sched +1:30 /home/ellie/scripts/logfile.sc sched