第七章 Bash 操作
一、 何谓 Bash
Bash(Bourne Again shell),是目前 Linux 上最流行的 Shell。
Shell,命令语言解释器(command-language interpreter)
Bash 相当于 DOS 系统的 Command.exe。
Linux 上还有一些较流行的 Shell,如 tcsh 、pdksh 等。
echo $BASH_VERSION 可检查当前所用的 Shell 版本。
若返回出错信息则表明当前的 Shell 不是 Bash,可执行:
exec /bin/bash 令系统使用 Bash
(/etc/shells 文件注册了当前系统所能使用的 shell 清单。)
二、 在一行上顺序执行多个命令
可用分号将几个命令串联,如:
mkdir mydir; cd mydir
注意:⑴用分号串联的命令个数没有固定限制;
⑵各命令依顺序执行,并非同时运行;
⑶无论前一个命令是否成功,都将执行下一个命令。
三、 引号和转义
•Linux 系统中需要转义的例子:
⑴$用来表示系统环境变量,可我们需要$的本来文字意义;
⑵显示出含*、?的文件名,比如 a?*,不希望按通配符解释。
这是就要使用转义符“
\”,来取特殊字符的文字意义,例:mkdir a\?\*; ls –l a\?\* 创建 a?*目录并显示其中内容
(思考:怎样显示 a?*目录本身属性?)
•单引号括住的字符或字符串只具文字意义;
双引号括住的字符或字符串允许特殊字符保持其特殊意义。
例:
echo $PATH; 将显示出当前搜索路径
echo ”$PATH” 同样将显示出当前搜索路径
echo ‘$PATH’ 将显示出“$PATH”
echo \$PATH 同样将显示出“$PATH”
(何时需使用单引号或双引号?如,包括空格的字符串!)
四、 设备转向(或称输入/输出重定向)
Linux 文件系统的标准设备有标准输入、标准输出、标准错误。
设备名称 缩写 序号 用途
默认连接
标准输入 stdin 0
读数据
键盘
标准输出 stdout 1
显示程序输出
显示器
标准错误 stderr 2
异常时显示错误和警告
显示器
设备的转向就是改变其输入/输出的设备指向,例如将键盘输
入转向为文件输入、将输出显示由显示器转向为文件等。
①输出转向
输出转向操作符是>和>>,分别用于新建和追加文件。
例:ls –l /dev/hd*>result.txt
将原本输出到屏幕的结果转存入新文件 result.txt。ls –l kkk>>result.txt
将 kkk 目录下的文件列表追加到 result.txt 中。
可是,若 kkk 目录不存在,出错信息因未转向而仍出现在
屏幕上。标准错误的重定向操作符是“2>”或“2>>”
(其实标准输出重定向操作符“>”是“1>”的省略形式)
若要将输出转到新文件 result.txt,并且当有错误发生时记录
到 error.txt 文件中,应该:
ls –l kkk>result.txt 2>error.txt
若要将标准输出和标准错误都转向到同一个文件,应该:
ls –l kkk>result.txt 2>&1
2>&1 句法告诉 Bash 那些本来输出到文件描述符 2(标准错
误)的内容传送到文件描述符 1(标准输出),由于文件描
述符 1 已被转向到文件,所以标准错误也被送入到同一文件
中。鉴于该操作极其普遍以至于 Bash 有一专门简化用法:
ls –l kkk &>result.txt
②输入转向
输入转向的操作符是“<”。
输入转向可将原本应由键盘输入的数据改由文件或其它输
入设备输入。例如以前学过的广播命令 wall,其格式是:
wall [广播信息]
若只键入 wall 就回车,程序将等待键盘输入,直到回车再
按 EOF(ctrl+d)。但为简化经常性的信息发布,我们可以建立一个包含信息的的文本文件 mes.txt,执行:
wall ③说明 ⑴其它教科书上一般都用 cat、wc 等命令来解释标准输入转 向,这些命令在无参数执行时确实是从标准输入设备输入 (这可使其作为过滤器),但有文件名作参数时就直接从 该文件输入,而不必非要加转向符。即cat a.txt和cat 效果一样。所以笔者不认为这类讲解是合适的,因为其不 能体现输入转向的实际应用价值。 ⑵ DOS 中标准输入和输出设备是 CON,标准打印输出是 PRN,执行 copy con a.txt 将接受其后的键盘输入,当按 F6 或 ctrl+z 时生成 a.txt 文件内容。同 DOS 用法类似, Linux 也可以使用 cp /dev/stdin a.txt 命令去创建文本文 件,或者使用 cp a.txt /dev/stdout 命令去显示文本文件内 容。所不同的是 Linux 系统的文件结束符是 ctrl+d 而不 是 DOS 中的 crtl+z。 五、 命令管道 使用管道操作符“ |”将一个以上的命令或程序连接起来,前 一个的输出作为后一个的输入,如此形成一个管道。 例:ls –l /dev|more 将目录列表分页显示(more 命令后述) (注:管道中的各个命令或程序是同时运行的。)六、 历史表文件.bash_history •每个用户的主目录下都有一个名为.bash_history 文本文件, 该文件记载了用户操作的历史记录。 •Bash 为每个用户维护着一个历史表。 •用户登录时该文件内容加载到历史表,注销时再更新该文件 • history 命令可以列出用户的操作记录,即历史表。 历史表的每一行称之为一个事件,行首数字表示事件号。 •用“!”加事件号作命令可以简便地重复该历史事件,如: !385 • 特殊操作符!!用于重复最近一个命令。 • 更常用的技巧:在 bash 下可直接用上光标键回溯操作历史。 七、 shell 函数 bash 允许用户自定义命令函数,其格式为: name() { command_list;} 即:函数名() { 命令列表;} 注意:⑴左花括号后要有一个空格,规定如此,未必有道理; ⑵命令列表可以是多个命令,每个命令后别忘有分号; ⑶函数中可使用$*提取函数的参数。 例:dir() { ls –ld $*;} 以后就可以用命令 dir 来列出指定目录中的文件名和目录名, 如:dir /etc 显示/etc 目录中的文件和目录列表八、 命令补全功能 tab 键可用来对命令补全,是 Linux 操作中最常用的技巧之一。 例:在安装一章我们曾接触过一条用于文档安装的命令: mount -t iso9660 -o loop /opt/RedhatLinux9.0 文档 CD.ISO /mnt/iso 这样长的命令且文件名夹杂汉字,输起来十分不易。 当然可先用 mv 命令将文件更名为一个简单的文件名,但利用 补全 bash 的功能更为简便: 当输到“mount -t iso9660 -o loop /opt/R”时按 tab 键,系统会 自动依据查找结果补全文件名,简化了不少操作。 若系统没有给予完全补全,说明存在近似的文件需要选择,例: 假设/opt 目录中还有一个 Redflag.iso,则光标会停在 Red 后, 此时需要按 h 或 f 进行下一步选择。 九、 作业控制 进程可以简单地理解为处于调度中的程序, 作业可能有多个进程(如管道)。 ①ps 查看进程状态命令 执行 ps 命令可以报告系统中进程的运行状况。如: PID TTY TIME CMD 2565 tty1 00:00:00 bash 2597 tty1 00:00:00 ps 即系统正在运行两个进程,bash 和 ps 本身。 常用的 ps 选项: a 显示所有用户的进程 e 命令执行后显示进程环境变量 f 输出全部信息 j 显示进程的父进程 PID l 以长格式输出 u 显示用户名和进程的开启时间 w 以宽格式输出,将一行显示不下的其余部分显示出来 t 显示与 tty 设备相关的进程 x 显示没有控制终端的进程 ps 输出域的含义: UID 进程所有者的名字 PID 进程 ID %CPU 进程的 CPU 利用率,计算原因有可能超过 100% %MEM 进程使用内存的百分比 SIZE 进程所使用的虚拟内存量,以 K 为单位 RSS 进程使用的驻留内存量或实际内存量 TTY 与进程相关的终端。有时缩写,如 p6=/dev/tty6。 STAT 进程的状态:R:正在运行或准备运行;S:休眠状 态;I:空闲状态;Z:僵尸进程;D:磁盘等待;P: 分野等待;W:交换到磁盘;T:终止;N:由 nice 降低优先级;<:由 root 提高执行优先级。START 进程启动的时间或日期 TIMR 进程使用总的 CPU 时间 CMD 正在执行的命令行 NI Nice 优先级 PRI 进程的优先级值 PPID 父进程的 PID WCHAN 进程因何内核函数而休眠,该函数名从 /boot/System.map 文件中检索 FLAGS 与进程相关的数字标志 ②jobs 显示当前尚未完成的作业 显示如下: [2]+Done find / -name fox.jpg [1]-Stopped man ls& []中是作业号;加号表示是当前默认作业;Running、Done、 Stopped 分别表示正在运行、完成、挂起。 ③在后台执行命令的方法 在命令行的末尾加上一个&。 将运行时间较长的程序放在后台运行可以腾出前台继续进 行其它操作。如:查找 fox.jpg 文件是个较长的过程,可以 使用命令: find / -name fox.jpg & 使其在后台运行,系统将显示:[1] 2551 [1]是任务的后台作业号,2551 是进程标识 PID。 (注:宜改用第 13 章的示例程序 beep1 来演示后台操作)。 ④作业的前后台切换 fg 将作业切换到前台 bg 将作业切换到后台 ctrl+z 挂起当前作业 fg、bg 默认针对当前作业。可使用参数指定其它作业, 如 bg %1 将 1 号作业放于后台。 后台的作业无法接收键盘的输入,若需要接收键盘的输入 则将被挂起。 实际上并不能直接使用 fg 命令将当前前台作业转为后台 运行,因为这时的键盘输入被视为对作业的输入而不是对 shell 的输入。解决方法是: 先 ctrl+z 挂起当前作业,再执行 bg 命令。 ⑤ sleep 使进程暂停一段时间 格式:sleep 以秒为单位的时间值 此命令大多用于 shell 编程中,使两条命令执行之间停顿 指定的时间。 例:sleep 100; who |grep ‘z3’ 使进程先停 100 秒,再查看 z3 是否正在使用系统。⑥ kill 向进程发信号 •信号概念:信号是一种机制,进程通过信号知道系统中正 在出现的事件,进程在任何时候都能接收到信号。信号通常用 来要求进程中断常规运行而做某种操作,大多数进程在收到信 号时的默认操作都是结束接收信号的进程,或其它操作。 Linux 的可用信号:(兰色表示常用) 信号名 值 说明 SIGHUP(HUP) 1 挂起。常使用该信号指示进程重载配置文件。 SIGINT(INT) 2 中断。 SIGQUIT(QUIT) 3 退出。 SIGILL(ILL) 4 非法指令。 SIGTRAP(TRAP) 5 跟踪陷阱。 SIGIOT(IOT) 6 IOT 指令。(input/output TRAP)指示一个实现定义的硬件故障。 SIGBUS(BUS) 7 系统总线错。 SIGFPE(FPE) 8 浮点运算错。 SIGKILL(KILL) 9 KILL。该信号不能被捕获(即由进程处理)、阻塞、忽略。 SIGUSR1(USR1) 10 用户自定义信号 1。 SIGSEGV(SEGV) 11 段错误。 SIGUSR2(USR2) 12 用户自定义信号 2。 SIGPIPE(PIPE) 13 写入一个管道,但该管道没有被其它进程读取。 SIGALRM(ALRM) 14 闹钟。 SIGTERM(TERM) 15 软终止信号。常在发 KILL 信号前发此信号给进程,进程在收到 此信号后准备退出。 SIGSTKFLT 16 协处理器栈错误。 SIGCHLD(CHLD) 17 子进程状态已改变。 SIGCONT(CONT) 18 收到 STOP 信号后继续。该信号不能被阻塞。 SIGSTOP(STOP) 19 停止。该信号不能被捕获(需要由进程自己处理)、阻塞、忽略 SIGTSTP(TSTP) 20 从键盘产生的 STOP 信号。 SIGTTIN 21 尝试从后台读取控制终端。 SIGTTOU 22 尝试从后台写入控制终端。 SIGURG 23 套接字上出现紧急情况。 SIGXCPU 24 超过 CPU 时间限制。 SIGXFSZ 25 超过文件大小限制。 SIGVTALRM 26 虚拟定时器报警。 SIGPROF 27 Profiling 定时器报警。 SIGWINCH 28 窗口大小改变。 SIGIO 29 在某个文件描述符上可以进行 I/O 操作。 SIGPWR 30 电源失效。 UNUSED 31 未使用。•kill 命令用作向进程发信号,常用来终止进程。 终止前台进程可按 ctrl+c,但终止后台进程需用 kill。 kill 的命令格式: kill [信号名或信号值] 进程 PID 如:kill 999 发-15 信号终止 PID=999 的进程 若不成功,可:kill –9 999 杀死 PID=999 的进程。 •使用 killall 命令代替 kill 可直接指定程序名: 例:killall –9 find 杀死所有与 find 命令有关的进程实例,尽管这些实例有 不同的 PID。 • kill 0 可撤消所有后台作业 十、 监视系统负荷 top 命令用来动态显示系统的运行状况。 按 q 结束监视退回 shell。