系统管理员工具包充分利用+bash.docx
《系统管理员工具包充分利用+bash.docx》由会员分享,可在线阅读,更多相关《系统管理员工具包充分利用+bash.docx(13页珍藏版)》请在冰豆网上搜索。
![系统管理员工具包充分利用+bash.docx](https://file1.bdocx.com/fileroot1/2023-2/9/439ac201-9ae7-40c3-99f2-1fdbe58f78ea/439ac201-9ae7-40c3-99f2-1fdbe58f78ea1.gif)
系统管理员工具包充分利用+bash
系统管理员工具包:
充分利用bash
简介:
通过利用Bourne-againshell(bash)的重要组成部分及其功能来简化系统管理任务。
Bash是一个流行的Shell,是对原始Bourne和KornShell的替代。
它提供了印象深刻的系列附加功能,其中包括对脚本环境的改进、广泛的别名技术和用于自动完成各种命令、文件和路径的改进方法。
关于本系列
典型的UNIX®管理员拥有一套经常用于辅助管理过程的关键实用工具、诀窍和系统。
存在各种用于简化不同过程的关键实用工具、命令行链和脚本。
其中一些工具来自于操作系统,而大部分的诀窍则来源于长期的经验积累和减轻系统管理员工作压力的要求。
本系列文章主要专注于最大限度地利用各种UNIX环境中可用的工具,包括简化异构环境中的管理任务的方法。
Bash背景介绍
UNIX和Linux®环境下的Shell通常可归入两个类别之一,这两个类别基于最初的UNIX版本所附带的原始Shell。
它们分别是BourneShell和CShell,后者的独特之处在于其格式和结构类似于C编程语言的格式和结构。
BourneShell比CShell更容易使用和理解,但是对于您可能希望在Shell编程环境中完成的更复杂脚本编程,它可能就不太实用了。
KornShell提供了BourneShell的易用性和附加的作业控制扩展(允许您容易地管理多个后台作业)、命令行编辑和历史记录,以及用于简化编程的附加CShell元素。
Bourne-againshell(bash)是一个开放源代码项目,它组合了BourneShell的原理、CShell的编程环境、KornShell的扩展功能,以及它自己的许多扩展,这些扩展不仅为Shell脚本编程提供了丰富的环境,而且还用作交互式的shell环境,用于控制并与计算机交互。
命令行编辑和键绑定
bash中的主命令提示符同时提供了编辑命令行的能力和历史记录功能,后者记住各个命令行,以便您能够再次执行它们。
编辑功能意味着您可以在当前显示的命令行中向前和向后移动,以做出更改或纠正输入错误。
在标准bash形式中,您可以使用光标键来执行基本的移动。
更广泛的命令(例如按单词向前和向后移动)可以通过Readline库来控制,该库在缺省情况下同时支持vi和emacs绑定。
若要设置编辑模式,可以在命令行上或在引导文件中指定您的首选模式:
$setediting-modeemacs。
例如,使用emacs编辑模式,以下键绑定将生效:
∙Control-A——此键绑定将当前位置定位到行开头。
∙Control-E——此键绑定将当前位置定位到行尾。
∙Control-K——此键绑定删除截止行尾的所有内容。
∙Meta-B——此键绑定后退一个单词。
∙Meta-F——此键绑定向前推进一个单词。
∙Meta-D——此键绑定删除当前单词。
使用内部bindbash命令,您实际上可以随心所欲地将任何键或组合绑定到某个特定的操作。
首先,您可以通过使用-P选项(请参见清单1)来获取可用命令列表。
清单1.使用-P选项来获取可用命令列表
$bind-P
abortcanbefoundon"\C-g","\C-x\C-g","\M-\C-g".
accept-linecanbefoundon"\C-j","\C-m".
alias-expand-lineisnotboundtoanykeys
arrow-key-prefixisnotboundtoanykeys
backward-byteisnotboundtoanykeys
...
yankcanbefoundon"\C-y".
yank-last-argcanbefoundon"\M-.","\M-_".
yank-nth-argcanbefoundon"\M-\C-y".
yank-popcanbefoundon"\M-y".
\C引用Control键。
\M序列引用“Meta”键(某些键盘上的专用键,或者通常为Alt键或Escape键)。
若要设置绑定,您必须指定键序列和要执行的命令,它们之间用分号分隔,并且键序列要用双引号来转义(在极端情况下,您可能需要使用单引号来对该形式进行再次转义)。
例如,若要将Control-B更改为逐个单词地向后移动,可以使用$bind"\C-b":
backward-word。
您甚至可以使用绑定来执行Shell命令(例如,运行某个应用程序)。
为此,您必须添加-x选项,这是需要两次转义的一个示例。
例如,若要将Control-E设置为运行emacs,您要使用以下命令:
$bind-x'"\C-e"':
emacs。
若要让bash中的键绑定在每次都启用,您可以设置.inputrc文件中的信息(然后此文件将影响所有启用了Readline的应用程序),或者您可以在启动脚本中放置特定的bash绑定,本文稍后将对此进行介绍。
回页首
命令历史记录
您输入的每个命令都被记录下来,以便您能够返回到该命令,并再次按原样运行它,或者编辑它并运行编辑后的版本。
使用Control-P(上一个命令)和Control-N(下一个命令),您可以在命令历史记录中向后或向前移动(按反向的年代顺序)。
如果已经遍历完前面的所有命令,则只能移动到下一个命令。
如果您知道命令的内容,但是想不起它的位置,您可以使用Control-R来执行反向智能搜索。
这将返回到与您键入的第一个字母相匹配的第一个命令(以反向顺序);随后键入的字母将使匹配变得越来越明确。
一旦找到您想要的命令,按Return即可按原样运行它。
若要编辑您找到的命令,可以使用光标键(或键绑定)来移动到您希望编辑的位置。
自定义提示符
所有Shell都允许您自定义命令行上显示的提示符,这通常是通过设置PS1变量来实现的。
这通常仅限于能够设置某个静态字符串,或者对于KornShell,您通常可以设置某个动态值,例如当前目录。
Bash进一步扩展了此功能,允许您包含用户名、主机名甚至隐藏字符(例如,设置颜色或设置窗口和Xterm标题所需的转义)。
所指定的字符串将紧跟在显示提示符之前求值,因此它始终是最新的。
特定动态值的自定义扩展是使用一系列反斜杠字符来实现的。
例如,若要设置包含用户名和当前目录最后一部分的典型提示符,可以使用以下命令:
PS1="\u\W$"。
更典型的解决方案是显示用户名、主机名、目录,以及美元符号或井号(具体取决于当前用户的UID)。
后一个选项在有效用户ID为零(root)时显示一个井号:
PS1='\u@\h:
\W\$"。
表1显示了可用扩展的完整列表。
表1.可用扩展列表
转义字符
描述
\t
\t是时间,格式为HH:
MM:
SS。
\d
\d是日期,格式为“工作日名称月份日期”(例如,星期五10月13日)。
\n
\n是换行。
\s
\s是Shell名称(通常为bash,如果该Shell是登录Shell,则为'-bash')。
\w
\w是当前目录的完整路径。
\W
\W是当前目录的最后一部分(换句话说,就是'/home/mc'中的'mc')。
\u
\u是您的用户名。
\h
\h是主机名。
\#
\#是此命令的命令编号(该值在每行递增一)。
\!
\!
是此命令的唯一历史记录编号。
\nnn
\nnn是由八进制nnn所标识的字符。
\$
\$在有效UID为零时为#字符,否则为$字符。
\\
\\是反斜杠。
\[
\[开始一个转义序列;一般用于颜色设置和标题的终端控制字符。
\]
\]结束转义序列。
转义序列可用于发送终端控制序列,后者又可用于设置颜色和终端标题。
由于bash会在每次显示提示符时更新此信息,这会自动更新相应的窗口标题。
例如,可以使用清单2中的以下序列来将终端窗口和Xterm标题设置为user@hostname:
fullpath,并将提示符设置为hostname:
endpath加上适当的终端字符(美元符号或井号)。
清单2.设置终端标题和提示符
PS1="\[\033]0;\u@\h:
\w\007\]\[\033[31m\]\h\[\033[34m\]\W\$\[\033[00m\]"
此外,主机名为root时是红色,为普通用户时为绿色,提示符中的其余部分则设置为青色。
文件和目录自动完成
为帮助提高您的Shell交互速度,bash包含路径名自动完成功能——也就是说,您可以让bash填充路径名的其余部分,或者为您提供可能的展开列表。
例如,如果您查看一下当前目录,可以看到一系列不同的子目录(请参见清单3)。
清单3.当前目录中的子目录
$ls-f
back/cheffyhack/edin/logstomerge/mysql-binlogs/svn/
build/cvs/install/lost+found/mysqlsizervmware/
calc/dbdumps/logs/fstatmon/webs/
若要切换到edin目录,您可以输入:
$cdedin。
或者,使用bash中的自动完成功能,您可以输入$cde然后按TAB键。
缺省情况下,这会尝试展开以'e'开头的路径名;此目录中的结果应该是$cdedin。
如果存在多个匹配项,则第一次按TAB将会失败;第二次按TAB将返回匹配的路径列表(请参见清单4)。
清单4.返回匹配的路径列表
$cdmy
fmysql-binlogs/mysqlsizer
展开过程将继续执行,并尽可能将每个部分替换为唯一组件,或者直到无法进一步展开或只存在唯一的路径。
例如,请考虑清单5中显示的以下序列。
清单5.继续展开
$cdmy
fmysql-binlogs/mysqlsizer
$cdmys
$cdmysql
mysql-binlogs/mysqlsizer
$cdmysqls
$cdmysqlsizer
如果路径名是一个目录,您可以继续展开该路径名的每个部分。
别名
别名是一种简单的机制,允许您为给定的序列提供展开形式。
由于别名是一种展开形式而不是替换,它使您可以继续向别名命令添加选项和参数。
例如,设置别名('ll')是很普遍的,该别名展开为'ls-l',用于获得目录或文件列表的长清单。
可以使用以下命令行来创建别名aliasll='ls-l'。
若要使用该命令,您只需在提示符下输入别名$ll。
由于别名不过就是实际命令的别名,因此您可以添加进一步的选项,例如,为了列出目录中的所有文件,您可以使用$ll-a,它实际上展开为$ls-l-a。
别名是快速运行命令或使用您经常使用的命令行选项来运行您最喜欢的命令的有效方法。
使用目录堆栈
目录堆栈使您可以将一个或多个目录存储到某个临时区域中,然后再次调回它们。
该目录列表的行为就像一个堆栈——您将一个目录压入堆栈顶部,并从顶部弹出一个目录以取回它。
若要将某个目录压入堆栈,您可以使用pushd和您希望放在堆栈上的目录——例如,您可以压入当前目录,该目录可由单个句点来标识(请参见清单6)。
清单6.压入当前目录
$pushd.
/export/data/export/data
Bash使用您压入的目录和当前在堆栈中的所有目录列表(目录之间用一个空格来分隔)来作出响应。
通过切换目录并再次压入目录,您可以更清楚地看到这点(请参见清单7)。
清单7.压入另一个目录
$cd/etc
$pushd.
/etc/etc/export/data
使用popd将取走添加到堆栈上的最后一个目录,并切换到该目录(请参见清单8)。
清单8.使用popd
$cd/usr/local/bin
$popd
/etc/export/data
$pwd
popd命令在切换到新目录前返回目录列表。
当您希望临时切换目录然后返回原始目录时,通常使用此目录功能。
为了简化此类情况,通常为bash配置了两个别名,即pu和po,如清单9所示。
清单9.Pu和po别名
$aliaspu='pushd.'
$aliaspo='popd'
例如,假设您正在某个目录中工作,突然认识到需要在另一个目录中创建一个tar存档(请参见清单10)。
清单10.使用pu和po来创建tar存档
$pwd
/usr/local/bin
$pu
/usr/local/bin/usr/local/bin
$cd/export/data
$tarcfwebs.tar./webs
$po
$pwd
/usr/local/bin
尽管目录堆栈系统支持多个目录,但通常是在您临时弹出到其他目录时将它用于一个或两个目录。
Bash运行时配置文件
在登录时,bash支持标准的.profile文件(BourneShell所使用的配置文件),除此之外还支持它自己的特定.bash_profile。
要使用的文件按如下方式进行选择:
∙如果~/.bash_profile存在,则使用它,否则:
∙如果~/.bash_login存在,则使用它,否则:
∙如果~/.profile存在,则使用它。
对于不是作为登录Shell来启动的bashShell(例如,在使用Xterm或启动某个子Shell的其他应用程序时),bash将寻找~/.bashrc文件(如果它存在的话)。
由于.bashrc和.bash_profile的内容不大可能会更改,查找包含清单11所示内容的.bash_profile的情况并不鲜见。
清单11..bash_profile内容
if[-f~/.bashrc];
then
source~/.bashrc
fi
除了这些规则外,那些文件的内容完全取决于您。
由于bash环境中存在如此多的自定义,您还可能经常发现.bashrc/.bash_profile内容不过是源于许多其他~/.bash_*脚本内容的包装。
例如,您可能将配置划分为:
∙~/.bash_aliases——用于存储所有自定义别名和函数
∙~/.bash_path——用于存储所有路径指定
∙~/.bash_vars——用于存储所有bash变量
然后又在.bashrc中引用它们的内容(请参见清单12)。
清单12..bashrc内容
if[-f~/.bash_path];then
source~/.bash_path
fi
if[-f~/.bash_vars];then
source~/.bash_vars
fi
if[-f~/.bash_aliases];then
source~/.bash_aliases
fi
您应该小心确保以正确的顺序引用那些文件。
脚本改进
bash提供的某些较大改进的最后一个方面是脚本功能。
对于大多数Shell,人们经常提到的局限性之一在于,它们具有松散的变量类型、没有数据数组支持、没有用于执行基本的数学或表达式计算的内置功能。
所有这些问题都在bash中得到不同程度的解决。
bash中的变量可以在使用前声明,并且声明可以包括类型。
例如,若要将某个变量声明为整数类型(从而始终将其标识为一个有效数字),可以使用:
$declare-imyint。
若要同时设置值,可以使用$declare-imyint=235。
若要执行基本的算术运算,您可以在$(())中嵌入表达式(请参见清单13)。
清单13.嵌入表达式以执行基本的算术运算
$echo$((4+3*12))
40
您还可以包括变量(请参见清单14)。
清单14.包括变量
$echo$((myint+3*12))
63
若要将某个变量声明为数组类型,可以使用$declare-amyarray。
您可以通过指定带括号的值列表来添加值:
$declare-amyarray=(tomdickharry)。
若要获取数组中的值,您可以指定数组引用(请参见清单15)。
清单15.指定数组引用
$echo${myarray[1]}
dick
您可以使用同样的机制来填充数组,例如,使用文件列表来填充数组(请参见清单16)。
清单16.使用文件列表来填充数组
$declare-afiles=`ls`
$echo$files
back/build/calc/cheffyhack/cvs/dbdumps/edin/install/\
logs/logstomerge/lost+found/my.
cnfmysql-binlogs/mysqlsizerstatmon/svn/vmware/webs/
而且,通过使用@符号来指定元素,您可以使用数组的整个内容(请参见清单17)。
清单17.使用@符号来指定元素
forfilein${files[@]}
do
echo$file
done
这种操作和变量支持使得Shell脚本的许多编程方面变得更加容易了。
总结
相对于传统的Bourne、Korn和CShell,Bash提供了许多重要改进。
这些扩展中的大多数都改善交互式用户(即使用bash作为其与系统交互的主要方法的用户)的体验。
有些机制成了习惯,例如路径名自动完成和别名;而其他机制则对个别场合至关重要。
目录堆栈机制就是一个很好的例子;当您希望快速访问某个目录而不打断您的思维时,它就变得非常有价值了。
无论使用bashShell中的什么元素,您都会发现一个丰富的环境和几乎无限的自定义系列,您可以使用它们来改进您的交互和环境。