只需点击几下

本文深入探讨了AIX操作系统中的KornShell,讲解了如何使用vi内联编辑器优化命令行工作流程,包括文本修改、文件名补全、历史记录管理和shell脚本技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

您与计算机交互的方式在不断变化。 曾经作为仅命令行界面启动的操作系统已移至图形前端。 但是,有时离开构成操作系统的构件并不一定是朝正确方向迈出的一步。 转向图形用户界面(GUI)通常意味着失去功能。 此外,用户也不太愿意了解他们正在使用的计算机的更多信息。 值得庆幸的是,AIX操作系统(与其他UNIX®和Linux®系统一样)一直保持重要的地位:计算机操作系统的稳定性,功能性和鲁棒性。

各种UNIX和Linux供应商都牢牢把握了操作系统CLI的重要性。 但是出于自动化的原因,使用户或其他方面的计算变得更容易,用户要么忘记,要么从未学习过CLI的来龙去脉。 本文为那些还没接触过CLI的用户或需要稍微动一下以记住为什么它对管理,开发和通用UNIX计算如此重要的用户提供了一些CLI方面的知识。

什么是命令行?

在计算机上工作时,了解您的实际工作很重要。 如果您曾经在UNIX或Linux上工作过,可以肯定地说,您已经听说过术语“ shell”或“ 命令行”。 这些术语可以作为同义词使用,指的是用户正在运行的实际UNIX Shell。 UNIX中的“ 外壳 ”一词是指您在键入命令或执行功能时使用的接口。

当用户通过控制台或网络登录UNIX系统时,会触发一个可定义的shell(在/ etc / passwd中),通过配置文件(在本文后面进行解释)来设置用户的环境。准备在外壳中执行操作。 当用户在命令行(即他或她正在使用的shell)上键入命令时,用户只能看到stdin或standard(即用户或程序提供的输入)。 当用户单击EnterReturn时 ,stdin将通过外壳发送以执行,并且用户可能会收到stdout或standard out以及stderr或standard错误,具体取决于输出如何重定向(例如,重定向到用户的显示器,文件,打印机)。 术语stdout是程序执行后返回的输出数据, stderr指程序遇到或返回的错误。 用户看不到所有处理单个或多个命令的低级代码执行,而是看到非常简单的输入,输出和错误。 因此,用户登录时引发的程序被正确地称为shell ,因为它隐藏了所有操作系统的低级调用。

外壳的历史

通过发展和增强,UNIX Shell已经存在了35年以上,并且仍在不断发展! 一切始于1971年,当时AT&T贝尔实验室的Ken Thompson创建了第一个UNIX外壳(命名为Thompson shell) 。 Thompson Shell的基本知识(例如,数据重定向)已存在于当今使用的Shell中,尽管Shell缺少UNIX用户每天使用的一些重要的内置函数,例如管道( | ),编写Shell脚本的能力以及if有条件的话。

结果,汤普森(Thompson)外壳在1977年被Bourne外壳或sh取代。Bourne外壳由AT&T Bell Laboratories的Stephen Bourne创建,成为UNIX 7(V7)版本的默认外壳。 Shell在UNIX的未来迈出了一大步。 现在,用户可以编写shell脚本了; 在变量中存储和导出信息; 控制文件描述符; 控制信号处理, for循环和case语句; 还有更多。 即使Bourne Shell创建于30年前,它仍然被许多当前的UNIX系统广泛使用,并且是当今许多UNIX系统上超级用户(root)的默认外壳。

在过去的三十年中,UNIX Shell进行了更改和改进。 结果,创建了几个不同的壳。 图1展示了一些UNIX shell的家族树。 该图绝不是完整的,但它显示了从中衍生出其他次要壳的主要壳。

图1. UNIX shell家族树
UNIX shell家族树

可恩壳

Korn外壳或ksh最初由AT&T贝尔实验室的David Korn于1982年开发。与许多其他外壳一样,该外壳与Bourne外壳(sh)向后兼容,并已发展成为一种坚固,稳定且非常可靠的外壳Shell已有25多年的历史了。 IBM在AIX中将Korn Shell用作其默认Shell。 有两个版本的Korn shell,AIX包含两个版本。

第一个(也是AIX中普通用户的默认Shell)是标准的ksh Shell。 Korn外壳符合用于计算机环境的便携式操作系统接口(POSIX),这是操作系统的国际标准。

AIX中提供的第二个Korn外壳是增强的Korn外壳,称为ksh93。 除了标准Korn外壳程序的所有强大功能之外,增强的Korn外壳程序还具有以下功能:

  • 算术增强
  • 复合变量
  • 复合作业
  • 关联数组
  • 变量名引用
  • 参数扩展
  • 纪律职能
  • 功能环境
  • 路径搜索规则
  • 壳牌历史
  • 其他内置命令

为了增强和ksh和ksh93的差异的完整列表,请参阅相关主题

使用ksh设置命令行环境

在使用ksh编辑命令行之前,您必须设置环境。 根据自己的喜好设置Korn shell相对简单:在ksh下登录时,通过使用-o开关和set命令来查看当前设置:

# set -o

Current option settings are:
allexport        off
bgnice           on
emacs            off
errexit          off
gmacs            off
ignoreeof        on
interactive      on
keyword          off
markdirs         off
monitor          on
noexec           off
noclobber        off
noglob           off
nolog            off
notify           off
nounset          off
privileged       off
restricted       off
trackall         off
verbose          off
vi               off
viraw            on
xtrace           off

以下是每种设置的简要说明。 (您也可以通过运行man set找到此说明。)

  • allexport :自动导出所有定义的后续变量。
  • bgnice :以较低的优先级在后台运行所有进程。
  • emacs :编辑输入的命令行文本时,请使用emacs样式的嵌入式编辑器。
  • errexit :如果命令的退出状态为0(零)以外的任何状态,请执行ERR陷阱(如果已设置并且存在)。
  • gmacs :编辑输入的命令行文本时,请使用gmacs样式的嵌入式编辑器。
  • ignoreeof :忽略文件结尾字符,并且不退出外壳程序。 如果用户要退出,则用户必须键入exit命令或按Control-D 11次。
  • keyword :此选项不是将所有参数放在命令之前,而是将所有参数放在命令环境中,可以使用set命令查看该参数。
  • markdirs :在所有来自文件名替换的目录的末尾放置一个正斜杠( / )。
  • monitor :作为一个单独的进程在后台运行所有进程,并通过在stdout上打印一行来通知用户该进程何时完成。
  • noexec :不执行命令。 相反,只需检查语法错误。

    注意 :如果在交互式shell中尝试,则不使用此参数。

  • noclobber :此标志禁止将输出重定向到现有文件时将其截断。 如果使用此选项,则如果使用大于号和竖线( >| )代替,截断仍然会发生。
  • noglob :禁用文件名替换。
  • nolog :如果使用此选项,功能定义将不会存储在历史记录文件中。
  • nounset :如果替换,所有未设置的参数将作为错误返回。
  • restricted :运行受限外壳。 用户无法更改目录; 更改其SHELL,ENV或PATH变量; 执行在路径名中包含正斜杠( / )的命令; 或重定向输出。
  • trackall :最初运行时,每个命令将成为跟踪的别名。
  • verbose :当外壳读取它们时,将所有输入行显示到stdout。
  • vi :编辑输入的命令行文本时,请使用vi样式的内联编辑器。
  • viraw :键入每个字符后,就像在vi编辑器中键入一样执行它。
  • xtrace :显示正在执行到标准输出的所有命令和参数。

要使用内置命令集打开选项,请使用-o开关。 如果您改变主意,则可以改用+o开关关闭设置的选项。

我在本文中重点介绍的主要选项是内联编辑器开关。 根据个人的不同,有人更喜欢一个文件编辑器,而不是另一个,例如vi,emacs或gmacs。 Korn外壳可容纳所有三个外壳。 但是,我专注于vi内联编辑器。 将内联编辑器选项设置为vi很容易。 只需在用于查看所有当前设置的命令中输入选项即可:

# set -o vi

而已! 要验证设置,您可以再次查看当前设置:

# set -o

Current option settings are:
allexport        off
bgnice           on
emacs            off
errexit          off
gmacs            off
ignoreeof        on
interactive      on
keyword          off
markdirs         off
monitor          on
noexec           off
noclobber        off
noglob           off
nolog            off
notify           off
nounset          off
privileged       off
restricted       off
trackall         off
verbose          off
vi             on
viraw            on
xtrace           off

使用Korn shell vi内联编辑器

现在您的外壳已配置为使用vi内联编辑器,现在该进行测试了。

在命令行上修改文本

现在,当您在命令行中键入内容时,就好像在vi编辑器中处于插入模式一样。 如果输入有误或需要在命令中添加一些内容以执行,只需单击Esc键退出插入模式并切换回命令模式。

例如,您当前所在的工作目录具有以下内容:

# ls
fileA    fileAA   fileAAA  fileAB   fileABA  fileABB  fileB    fileBAA  fileBB   fileBBB

您要查找以fileAA开头的文件并将其删除:

# find . -name "fileAB*" -exec rm {} \;

在执行键入的行之前,您会注意到您犯了一个错误,并意外键入了fileAB而不是fileAA ! 不用担心。 只需退出插入模式即可切换到命令模式,将光标移动到不正确的字母,然后替换它—全部使用vi命令。 在仍然处于嵌入式编辑器的插入模式下时,要分解命令序列:

  1. 单击Esc切换到命令模式。
  2. 使用vi样式移动命令向左移动光标以突出显示字符串“ fileAB *”中的B。 (H键向左移动。)

    注意 :如果您习惯于在vi中使用箭头键,明智的做法是学习键盘上的实际字母来移动光标,因为TERM类型可能有所不同,并且使用箭头键可能无法获得所需的结果:

    • h :左
    • l :对
    • k :向上
    • j :向下
  3. 使用vi样式的“替换单个字符”命令将B替换为A (即,单击R ,然后键入A )。

查看完工作并同意要这样做后,请单击Enter执行命令:

# find . -name "fileAA*" -exec rm {} \;# ls
fileA    fileAB   fileABA  fileABB  fileB    fileBAA  fileBB   fileBBB

文件名补全

Korn shell中的vi内联编辑器的另一个有用操作是文件名完成。 在执行命令时,通常会将您用作stdin或stdout(或stderr)参数的文件写入文件。 文件名可能会很长,可能有多个文件的名称相似,或者您根本不记得完整的文件名。 这是抢救文件名的地方。 如果在输入文件名时进入一半,只需单击Esc键,然后单击反斜杠( \ )键。 方便且节省大量时间!

例如,我想在AIX上查看/ etc / filesystems文件,但是忘记了完整的文件名。 我知道这是在/ etc,我知道该文件开头的文件 ,但仅此而已。 我只需键入view /etc/file并单击Esc- \ ,然后瞧瞧! ksh为我完成了生产线。 命令行现在读取view /etc/filesystems

在目录结构上也可以这样做,因为它们实际上也只是文件名。

查看和修改命令历史记录

在UNIX系统上监视进程或执行某些其他功能时,一次又一次键入同一命令? Korn shell具有内置的命令历史记录供您查看,而不是不断重复输入。 如果您也将内联编辑器设置为vi ,则ksh允许您拉取该用户执行的命令的历史记录(有时仅用于该会话),具体取决于您配置系统的方式,并像其他任何命令一样修改命令在命令行上键入的文本。

如果您在变量HISTFILE中定义了文件名,则ksh允许用户从其历史记录中提取并修改命令或仅重新执行原始命令。 例如,以下是示例$ HISTFILE的最近10次出现:

# tail -10 $HISTFILE
ls
cd ~cormany/testdir/dirA
./fileA 1>fileA.out 2>fileA.errors
pwd
ps –fu cormany
df –k .
ps –fu cormany
find . –name “fileA.out” –ls
find . –name “fileA.errors” –ls
tail -10 $HISTFILE

在命令行上时,只需在vi内联编辑器中单击Esc进入命令模式,然后单击K拉出最后执行的命令。 由于您仍处于命令模式,因此可以继续单击K向上移动已执行命令的历史记录,或单击J向下移动列表。

为帮助简化命令模式光标的移动,当在命令提示符下单击Esc时,请考虑将$ HISTFILE作为vi中的普通文件加载。 在vi编辑器中,K键向上移动一行,而J键向下移动一行。 如果单击Esc-J并使用示例$ HISTFILE,则可视化编辑$ HISTFILE和光标从文件底部开始。 该行将是tail -10 $HISTFILE 。 如果再次单击J ,则将在您正在编辑的$ HISTFILE中向上移动一行,即为find . -name "fileA.errors" –ls find . -name "fileA.errors" –ls

图2提供了一个小的“备忘单”,将常规的vi命令模式光标移动与ksh vi内联编辑器命令模式移动进行了比较。

图2. vi命令模式备忘单
vi命令模式备忘单

命令行与Shell脚本

有时需要使用Shell脚本,有时需要使用命令行。 如果要按常规执行任务,或者请求的任务很复杂,需要进行数据操作,而不是总是要求用户键入命令,那么Shell脚本将变得有用。 在其他情况下,当它是单个事件并且相对简单时,命令行可以很好地解决问题。

例如,使用以下目录清单:

# ls
fileA.tar.gz   fileAA.tar.gz  fileB.tar.gz   fileBB.tar.gz

如果您只是想解压缩文件,使用bzip2重新压缩它们,然后将它们传输到ATC-AIX2,而不是键入shell脚本,则可以在命令行上进行操作。 将Shell脚本想像成一次键入几个命令行条目,因为从某种意义上说,这就是它的真正含义。 在命令行上键入命令时,就像在脚本中键入命令,然后执行脚本一样。

您想遍历以gz结尾的目录中的文件,解压缩它们,用bzip2重新压缩,然后在文件上使用scp命令到ATC-AIX的目标服务器。 循环在命令行上的工作原理与脚本中的一样好。 开始loop…if条件语句, case语句或其他代码块语句,则您正在运行的ksh只会将光标移至下一行,但提示符将变为$ PS2。 代码块完成后,将执行代码块并将用户返回到$ PS1提示符。

换一种说法:

  • $ PS1提示 :等待下一个命令
  • $ PS1提示 :代码块开始
  • $ PS2提示 :代码块继续
  • $ PS2提示 :代码块继续
  • $ PS2提示 :代码块结束
  • 代码块执行
  • $ PS1提示 :等待下一个命令

变量PS2的默认值为> 。 返回到先前的解压缩功能,然后重新压缩,您只需在ksh命令行中键入以下内容:

# for _FNAME in 'ls -1 *.gz'
> do
> gzip -d ${_FNAME}
> bzip2 ${_FNAME%*.gz}
> scp ${_FNAME%*.gz}.bz2 cormany@ATC-AIX2:/home/cormany
> done

当您在完成代码块后单击Enter (即,对于以done结束的循环)时,循环将开始。 在命令行上键入的循环将在当前工作目录中搜索所有以.gz结尾的文件,将其解压缩,使用bzip2重新压缩,然后将其传输到ATC-AIX2上的目录/ home / cormany。 就这么简单。

结论

阅读本文之后,您现在应该能够以以前不知道的方式使用Korn shell。 掌握命令行可以简化您的工作,并帮助您更好地了解如何使Shell和命令行对您有用,而不是您需要为此付出更多努力。


翻译自: https://www.ibm.com/developerworks/aix/library/au-speakingunix_commandline/index.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值