对话 UNIX 简单的按键操作.docx
- 文档编号:4243536
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:12
- 大小:37.25KB
对话 UNIX 简单的按键操作.docx
《对话 UNIX 简单的按键操作.docx》由会员分享,可在线阅读,更多相关《对话 UNIX 简单的按键操作.docx(12页珍藏版)》请在冰点文库上搜索。
对话UNIX简单的按键操作
像专家那样编辑命令行
用户与计算机交互的方式在不断发生变化。
启动后提供纯命令行界面的操作系统已逐渐演化为图形化前端。
但是,脱离构成操作系统的构建块有时并非是迈向正确方向的必要步骤。
IBM®AIX®操作系统一直把握着重点:
稳定性、功能和稳健性。
它通过保留强大的命令行界面(CLI)来实现这一目标。
如果您未曾学习如何使用CLI或需要复习CLI的基础知识,请继续往下阅读。
用户与计算机交互的方式在不断发生变化。
启动后提供纯命令行界面的操作系统已逐渐演化为图形化前端。
然而,脱离构成操作系统的构建块有时并非是迈向正确方向的必要步骤。
向图形化用户界面(GUI)过渡往往意味着损失功能;而且,用户渐渐倾向于不愿详细了解他们所使用的计算机。
幸运的是,与其他UNIX®和Linux®系统类似,AIX操作系统一直把握着重点:
计算机操作系统的稳定性、功能和稳健性。
大量UNIX和Linux供应商已充分认识到操作系统的CLI的重要性。
但是,出于自动化、降低用户使用计算机的难度或其他原因,用户已忘记或从未了解CLI的细节。
本文向新用户和已经遗忘细节的用户介绍CLI,以帮助他们记住或回想起CLI对于管理、开发和常规UNIX计算之所以重要的原因。
什么是命令行?
在计算机上工作时,了解实际使用的工具非常重要。
如果您曾经使用过UNIX或Linux,那么您应该听说过术语 shell 或 命令行。
这两个术语可以作为同义词使用,并且指的是用户正在运行的实际UNIXshell。
UNIX中的术语 shell 指的是您在键入命令或执行功能时所使用的接口。
当用户通过控制台或网络登录UNIX系统时,将调用可定义shell(位于/etc/passwd),并通过配置文件设置用户环境(本文稍后将进行说明),于是用户准备好在shell中执行操作。
当用户在命令行(即用户正在使用的shell)中键入命令时,用户只能看到 stdin(即标准输入),这是用户或程序提供的输入。
当用户按 Enter 或 Return 键时,通过shell发送stdin以执行命令,然后用户可能收到 stdout(即标准输出)和stderr(即标准错误),具体取决于输出重定向的方式(例如,重定向到用户的显示器、文件或打印机)。
术语 stdout 表示执行的程序所返回的输出数据,而 stderr 指的是程序遇到或返回的错误。
用户不会看到处理单个或多个命令的所有底层代码的执行情况,而是看到非常简单化的输入、输出和错误。
由于上述原因,用户登录时调用的程序被恰当地称为 shell,因为它隐藏了操作系统的所有底层调用。
回页首
shell的历史
UNIXshell至今存在的时间已超过35年,它现在仍然在发展壮大!
它创始于1971年,这一年AT&T贝尔实验室的KenThompson创建了第一个UNIXshell,它具有贴切的名称 Thompsonshell。
虽然Thompsonshell缺少人们日常使用的UNIX所具备的一些重要内置功能,如管道(|)、编写shell脚本的能力和 if 条件语句,但是该shell的基础功能(如数据重定向)仍存在于现今使用的shell中。
后来,在1977年,Thompsonshell被Bourneshell(即 sh)所取代。
Bourneshell是由AT&T贝尔实验室的StephenBourne创建的,它成为UNIX第7版(V7)的缺省shell。
Bourneshell使UNIX的发展向前迈进了一大步。
到这时,用户可以编写shell脚本,在变量中存储信息和导出信息,控制文件描述符,控制信号处理,使用 for 循环和 case 语句,以及其他大量功能。
虽然Bourneshell创建至今已有30多年时间,目前它仍在大量的UNIX系统中广为使用,并且是当今许多UNIX系统的超级用户—root—的缺省shell。
在过去三十年中,UNIXshell获得了许多改进和增强。
结果,出现了多种不同的shell。
图1 显示了少数UNIXshell的家族树。
虽然该图并不完整,但它显示了衍生出其他较次要shell的那些主要shell。
图1.UNIXshell家族树
回页首
Kornshell
1982年,AT&T贝尔实验室的DavidKorn开发了Kornshell(即 ksh)。
Kornshell与许多其他shell类似,向后兼容Bourneshell(sh)。
在超过25年的发展历程中,它已进化为强健、稳定和非常可靠的shell。
IBM在AIX中使用Kornshell作为其缺省shell。
Kornshell共有两个版本,它们均包含在AIX中。
第一种是AIX普通用户的缺省shell,即标准kshshell。
Kornshell符合计算机环境的可移植操作系统接口标准(POSIX),这是操作系统的国际标准。
AIX提供的第二种Kornshell是增强Kornshell,称为 ksh93。
除标准Kornshell所拥有的所有强大功能外,增强Kornshell还包含如下功能:
∙算术增强
∙复合变量
∙复合赋值
∙关联数组
∙变量名引用
∙参数扩展
∙规程函数
∙函数环境
∙PATH搜索规则
∙shell历史记录
∙其他内置命令
有关ksh93增强功能以及ksh与ksh93之间差异的完整列表,请参阅参考资料。
使用ksh设置命令行环境
在介绍如何使用ksh编辑命令行之前,必须设置您的环境。
根据您的喜好来设置Kornshell相当简单:
登录到ksh下时,使用带有 -o 开关的set 命令来查看您的当前设置:
#set-o
Currentoptionsettingsare:
allexportoff
bgniceon
emacsoff
errexitoff
gmacsoff
ignoreeofon
interactiveon
keywordoff
markdirsoff
monitoron
noexecoff
noclobberoff
nogloboff
nologoff
notifyoff
nounsetoff
privilegedoff
restrictedoff
trackalloff
verboseoff
vioff
virawon
xtraceoff
下面简单介绍各项设置。
(您也可以通过运行 manset 找到这些说明。
)
∙allexport:
自动导出所有定义的后续变量。
∙bgnice:
在后台以更低的优先级运行所有进程。
∙emacs:
编辑输入的命令行文本时,使用emacs风格的行内编辑器。
∙errexit:
如果某个命令产生非0(零)的退出状态并且设置了ERR陷阱,则执行ERR陷阱并退出。
∙gmacs:
编辑输入的命令行文本时,使用gmacs风格的行内编辑器。
∙ignoreeof:
忽略文件结束字符,并且不退出shell。
如果用户想要退出,则必须键入 exit 命令或按11次Ctrl-D。
∙keyword:
此选项将命令的所有参数放入环境中,而不仅仅放入命令之前的参数,使用 set 命令可以查看这些参数。
∙markdirs:
在来自文件名替换的所有目录的末尾添加一个正斜杠(/)。
∙monitor:
将所有后台进程作为独立进程运行,并在进程结束时向stdout输出一行信息以通知用户。
∙noexec:
不执行命令。
仅检查语法错误。
注意:
此参数在交互式shell中无效。
∙noclobber:
当输出重定向到现有文件时,此标记可阻止截断这些文件。
然而,启用此选项后,如果使用大于号加管道符号(>|),则仍然会发生截断。
∙noglob:
禁用文件名替换。
∙nolog:
如果使用此选项,则函数定义不会存储在历史文件中。
∙nounset:
如果执行替换,则所有未设置参数都作为错误返回。
∙restricted:
运行受限制的shell。
用户无法执行下列操作:
更改目录;更改SHELL、ENV或PATH变量;执行在文件名中包含正斜杠(/)的命令;或重定向输出。
∙trackall:
每个命令在最初运行时都作为被跟踪的别名。
∙verbose:
当shell读取输入行时,向stdout显示所有这些行。
∙vi:
编辑输入的命令行文本时,使用vi风格的行内编辑器。
∙viraw:
键入字符时,将每个字符处理成在vi编辑器下输入的原样。
∙xtrace:
执行命令时,向stdout显示所有命令和参数。
若要开启内置命令集选项,请使用 -o 开关。
相反,如果改变主意,可以使用 +o 开关关闭这些选项。
本文将重点讲述的主要选项是行内编辑器开关。
根据个人喜好不同,人们往往偏爱vi、emacs或gmacs文件编辑器中的某一个。
Kornshell包含所有这三种编辑器。
然而,我将重点介绍vi行内编辑器。
将行内编辑器选项设置为 vi 十分简单。
只需在用于查看所有当前设置的命令后加上选项vi:
#set-ovi
大功告成!
若要验证该设置,可以再次查看您的当前设置:
#set-o
Currentoptionsettingsare:
allexportoff
bgniceon
emacsoff
errexitoff
gmacsoff
ignoreeofon
interactiveon
keywordoff
markdirsoff
monitoron
noexecoff
noclobberoff
nogloboff
nologoff
notifyoff
nounsetoff
privilegedoff
restrictedoff
trackalloff
verboseoff
vion
virawon
xtraceoff
回页首
使用Kornshellvi行内编辑器
既然已将您的shell配置为使用vi行内编辑器,现在应该开始进行测试了。
在命令行上修改文本
现在,当您在命令行上键入时,将其视为处于vi编辑器中的插入模式。
如果出错或者需要向要执行的命令添加一些内容,只需按 Esc 键退出插入模式并切换回命令模式。
例如,您当前所在的工作目录包含如下文件:
#ls
fileAfileAAfileAAAfileABfileABAfileABBfileBfileBAAfileBBfileBBB
您希望查找以 fileAA 开头的文件并删除它们,于是输入以下命令:
#find.-name"fileAB*"-execrm{}\;
在执行您输入的行之前,您发现自己犯了一个错误,意外地将 fileAA 误输入为 fileAB。
不必担心。
只需退出插入模式并切换到命令模式,将光标移动到错误字符并进行替换,所有这些操作都使用vi命令完成。
下面详细说明命令序列,此时仍然处于行内编辑器的插入模式:
1.按 Esc 切换到命令模式。
2.使用vi风格的移动命令向左移动光标,以突出显示字符串“fileAB*”中的 B。
(H键可向左移动光标。
)
注意:
如果您习惯于在vi中使用箭头键,那么明智的做法是了解键盘上用于移动光标的实际字母键,因为不同类型的终端上的箭头键不一定能产生预想中的结果:
oh:
向左
ol:
向右
ok:
向上
oj:
向下
3.使用vi风格的“替换单个字符”命令将 B 替换为 A(即单击 R,然后键入 A)。
经过检查确认输入无误后,按 Enter 键执行命令:
#find.-name"fileAA*"-execrm{}\;#ls
fileAfileABfileABAfileABBfileBfileBAAfileBBfileBBB
文件名完成
Kornshell中vi行内编辑器的另一个十分有用的操作是文件名完成。
执行命令时,经常会遇到这样一种情况,您用作stdin、stdout或stderr参数的文件将被写入到某个文件中。
文件名可能很长,也可能有多个文件具有类似的文件名,或者您就是无法记起完整的文件名。
这时就会用到文件名完成功能。
在键入文件名时,如果完成了一部分,那么只需先按 Esc 键,再按反斜杠(\)键。
这样做省时省力!
例如,我要查看AIX上的/etc/filesystems文件,但我忘记了完整文件名。
我知道它位于/etc下,并且该文件以 file 开头,仅此而已。
我只需键入 view/etc/file 并按 Esc-\,哇!
ksh已经为您完成了这行内容。
现在命令行显示为 view/etc/filesystems。
对于目录结构也可以执行同样的操作,因为它们实际上也可算作文件名。
查看和修改命令历史记录
在您的UNIX系统上监视进程或执行其他一些功能时,您需要多次反复键入相同的命令。
为了避免反复重新输入的麻烦,Kornshell提供了内置的命令历史记录供您查看。
如果您也将行内编辑器设为 vi,ksh将允许您提取用户所执行命令的历史记录(有时仅限该会话,具体取决于您的系统配置),并按照您在命令行中输入的其他文本修改命令。
如果您在变量HISTFILE中定义了一个文件名,ksh允许用户从其历史记录中提取和修改命令,或仅仅再次执行原始命令。
例如,以下是示例$HISTFILE显示的最后10个命令:
#tail-10$HISTFILE
ls
cd~cormany/testdir/dirA
./fileA1>fileA.out2>fileA.errors
pwd
ps–fucormany
df–k.
ps–fucormany
find.–name“fileA.out”–ls
find.–name“fileA.errors”–ls
tail-10$HISTFILE
在命令行中,只需按 Esc 键即可进入vi行内编辑器的命令模式,然后按 K 键提取上次执行的命令。
由于您仍处于命令模式,您可以继续按 K键向上移动所执行命令的历史记录,或按 J 键向下移动列表。
若要帮助简化命令模式下的光标移动,当您在命令提示符处按 Esc 键时,请想象您加载的$HISTFILE为vi中的普通文件。
在vi编辑器中,K键向上移动一行,而J键向下移动一行。
如果按 Esc-J 键并使用示例$HISTFILE,想象正在编辑$HISTFILE,并且光标开始位于文件底部。
该行将显示 tail-10$HISTFILE。
如果再次按 J 键,正在编辑的$HISTFILE将向上移动一行,显示为 find.-name"fileA.errors"–ls。
图2 提供了小型的“备忘单”,将常规vi命令模式光标移动与kshvi行内编辑器命令模式移动进行比较。
图2.vi命令模式备忘单
回页首
命令行与shell脚本
有时会用到shell脚本,其他一些时间则要用到命令行。
如果需要定期执行某项任务,或者任务非常复杂、需要进行数据处理,同时不需要用户反复键入各种命令,则适合使用shell脚本。
有时,某些任务只需要执行一次并且相对简单,则使用命令行可以很好地完成这类任务。
例如,假设存在下列字典列表:
#ls
fileA.tar.gzfileAA.tar.gzfileB.tar.gzfileBB.tar.gz
如果只需要解压缩文件,并使用bzip2重新压缩,然后将它们传送到ATC-AIX2上,那么与其键入shell脚本,不如使用命令行。
可以将shell脚本视为一次输入多个命令行条目,因为从某种意义上来说,这就是实际情况。
在命令行上键入命令时,就像将它们输入到脚本中,然后执行脚本。
您希望遍历目录中以 gz 结尾的文件,解压这些文件,然后使用bzip2重新压缩它们,再对这些文件使用 scp 命令,将它们复制到目标ATC-AIX服务器上。
循环在命令行中的工作效果与在脚本中同样出色。
当开始 loop…if 条件语句、case switch语句,或其他代码块语句时,您正在运行的ksh只会将光标移动到下一行,但提示符将更改为$PS2。
当代码块完成时,将执行代码块并使用户返回$PS1提示符。
也就是说:
∙$PS1提示符:
等待下一个命令
∙$PS1提示符:
代码块开始
∙$PS2提示符:
代码块继续
∙$PS2提示符:
代码块继续
∙$PS2提示符:
代码块结束
∙代码块执行
∙$PS1提示符:
等待下一个命令
变量PS2的缺省值为 >。
返回前一个解压缩后重新压缩的功能,您只需在ksh命令行中键入以下内容:
#for_FNAMEin'ls-1*.gz'
>do
>gzip-d${_FNAME}
>bzip2${_FNAME%*.gz}
>scp${_FNAME%*.gz}.bz2cormany@ATC-AIX2:
/home/cormany
>done
完成代码块(也就是说,使用 done 结束循环)后按 Enter 键,将开始执行循环。
在命令行上键入的循环将搜索当前工作目录下以 .gz 结尾的所有文件,将这些文件解压缩,然后使用bzip2重新压缩它们,最后将它们复制到ATC-AIX2上的/home/cormany目录中。
就是如此简单。
结束语
在阅读本文之后,您应当能够学会以新的方法使用Kornshell。
掌握命令行可以简化您的工作,并帮助您更好地理解如何在工作中充分利用shell和命令行,从而摆脱使用它们的困扰。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 对话 UNIX 简单的按键操作 简单 按键 操作