ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
**环境** [TOC] ## 第12章shell`history ![!] alias unalias` 12.1 查看命令行历史`history` 12.2 再次运行最近输入的命令`!!` 12.3 使用数字再次运行之前的命令`![##]` 12.4 使用字符串再次运行之前的命令`![sting]` 12.5 搜索之前输入的命令并运行`^-r(Ctrl+r)` `^-s(Ctrl+s)` `^-g(Ctrl+g)` 12.6 显示所有命令的别名`alias` 12.7 查看特定命令的别名`alias [aliasName]` ~~~ $ alias wgetpage alias wgetpage="wget --html-extension --recursive --convert-links --page-requisites --no-parent" ~~~ 12.8 创建新的临时别名`alias [aliasName]="[command]"` 在命令行中使用`alias`时,应该注意几点: * 别名中不能包含有其他含义的等号`=`因为在定义别名时,会在名称后面立即跟上一个等号。 不过,在别名的实际内容中可以使用等号。 * 创建的别名只在当前会话有效时才存在。 退出会话后,别名也就不存在了。 12.9 创建新的永久别名`alias [aliasName]="[command]"` 如果想让别名能够在不同的shell会话中使用,就需要把它们添加到shell用来存储别名的文件中。 大多数情况下,这个文件是`.bashrc` 或`.bash_aliases`。 不管使用哪个文件,编辑它们时都要保持谨慎,因为错误的编辑会在以后登录时造成麻烦。 如果确实非常谨慎,可以在编辑文件之前先创建备份,这样才可以做到有备无患。 >[warning] 如何找出应该使用哪个文件保存别名? > 1. 输入`ls -a ~`如果在结果中看到`.bash_aliases`,就使用这个文件;否则,可查看`.bashrc`,确定在其中是否定义了其他别名(然后表明使用`.bash_aliases`)。 > 2. 如果在`.bashrc`文件中没有看到任何别名,就可看一下`.profile`文件,偶尔也会用到该文件。 要在`.bash_aliases` 中添加新的别名,可使用首选的文本编辑器打开该文件,然后加入如下的一行: `alias lsd="ls -d*/"` 保存文件并关闭,再重新加载该文件 `source ~/.bash_aliases` 新的别名就生效了。 12.10 删除别名`unalias` `unalias`仅仅删除命令行中定义的别名。 要删除`.bash_aliases` 中定义的别名可以: 1. 删除别名定义的内容; 2. 用`#`注释定义别名的内容。 12.11 创建新的临时函数 如果在命令行上创建函数(毕竟这就是创建临时函数的方式) `function [functionName] {}` `[functionName] () {}` 可在单独一行中创建简短的、临时的函数 ~~~ $ mkcd () { mkdir -p "$l"; cd "$l";} $ mkcd lovecraft $ pwd /home/scott/lovecraft ~~~ 如上述示例所示,首先使用`mkdir -p`创建新的目录,然后使用`cd`命令进入该目录。 注意: * 使用单行方法,则必须在每个命令后面加上分号。 * 函数中的`$l`是一个定位参数,该参数会替换为函数名后输入的第一个实参。 函数也可以延伸到多行。 输入新函数的第一行并按Enter键之后,则会出现形如`>`的二级提示 符。`bash` 使用此提示符表明其需要更多输入才可以完成命令。例如: ~~~ $ mkcd () { > mkdir -p "$l" > cd "$l" > } ~~~ 在此例中,因为正在创建函数,所以`bash`会等待用户最终输入`}`并按下 Enter键。 在此之前,每当你输入函数的代码行并按Enter 键,随后一行都会从`>`开始,表明`bash`仍然在等待输入。 通过命令行创建的函数都只在shell会话活动期间才生效。一旦注销会话,该函数就会消失。 12.12 创建新的永久函数 ?? 12.13 显示所有函数 ?? 12.14 删除函数`unset ` ?? 12.15 何时使用别名以及何时使用函数 别名和函数都是随shell一起载入内存(现代计算机如此健全,函数占用的内存很少,因此你不需要担心载入内存带来的负面影响),并且都只能由当前的 shell 使用,因此只会影响目前使用的 shell环境(这一点不同于脚本)。 实际上,官方GNUBash 参考手册对于别名有如下说明:“从几乎每种用途来说,shell 中的函数都是比别名更优先的选择。“原因是: * bash始终先执行函数后执行别名。 * 别名用于将长命令转变为更短、更容易记住的名称(例如,`alias wgetpage="wget --html-extension --recursive --convert-links --page-requisites--no-parent"`),或者用于将所需的实参添加到命令上(例如 `alias lsd="ls -d*/"`)。 * 函数面向更长或更复杂的命令序列,通常还带有逻辑和循环。 别名和函数重要的区别在于处理实参的方式: * 别名基本上会将实参以输入的相同顺序直接传递到别名命令的末尾。 * shell函数可捕获实参,然后重新排列、测试、删除和操作这些实参。 `bash` 将实参置于别名中命令的末尾。 ~~~ $ alias lstest="ls -l $l | grep tar" $ lstest /bin grep: /bin: Is a directory $ unalias lstest ~~~ 此代码执行失败的原因是:因为`bash`自动将实参`/bin`附加到末尾,即`gep tar`的后面。 因此,不是创建`ls -l /bin | grep ta`,而是实际地构造`ls -l |grep tar /bin`。这就是grep报告错误的原因:你告诉该命令在目录名中查找单词“tar”,这将无法找到;而改为在文件或文件列表中查找时,就可成功找到。 `bash` 将实参置于函数中的对应位置。 ~~~ $ lstest () {ls -l $l | grep tar;} $ lstest /bin -rwxr-xr-x root root tar* -rwxr-xr-x root root unicode start* ~~~ ## 第13章 监视系统资源`uptime` `ps` `top` `lsof` `free` `df` `du` 13.1 显示计算机的持续运行时间`uptime` 13.2 查看正在运行的所有进程`ps aux` 表13-1 STAT列中字母的含义?? 对于`ps`命令(process status),为了让操作更为方便统一,对于他的选项不要求用连字符。各选项的意义如下: `a`:所有用户; `u`:以面向用户的格式显示,或显示拥有每个进程的用户; `x`:没有控制终端设备或终端屏幕的进程,“显示每个进程”的另一种说法。 `-w`:wrap,换行 13.3 查看进程树`ps axjf` Linux系统中,所有的进程最初都来自`init`,它是所有进程之母,其PID始终为1。 各选项的意义如下: `a`:所有用户; `x`:没有控制终端设备或终端屏幕的进程,“显示每个进程”的另一种说法; `j`:用于BSD作业控制格式,它确定了你所看到的列; `f`:forest,源自`ASII art forest`。 ![](https://box.kancloud.cn/abebacc9db225f0995fd9e7dc09a4a89_1149x1008.jpg) 注意其中的`PPID`列,该列为Parent Process ID(父进程编号)是创建PID进程的进程编号。 有了`PID`和`PPID`,就可以终止任何失控的进程。 查看进程树的另一种方式:`pstree`。但并不是所有系统都包含该命令,可能需要进行安装。 ![](https://box.kancloud.cn/c22f899cc3b86f091d95d676568259bf_685x367.jpg) 13.4 查看特定用户拥有的进程`ps U [userName]` 13.5 终止正在运行的进程`kill` `killall` 表13-2 与kill命令关联的常用信号?? 13.6 查看运行中进程的动态更新列表`top` ?? 13.7 列出打开的文件`lsof` ?? 13.8 列出某个用户打开的文件`lsof -u` ?? 13.9 列出使用特定文件的用户`lsof [file]` ?? 13.10 列出特定程序的进程`lsof -c [program]` ?? 13.11 显示系统RAM的相关信息`free` ?? 13.12 显示文件系统的磁盘使用情况`df` ?? 13.13 报告目录使用的文件空间`du` ?? 13.14 只报告目录使用的总空间`du -s` ?? ## 第14章 安装软件 14.1 安装软件包(RPM) 14.2 删除软件包(RPM) 14.3 安装软件包及其依赖程序(RPM) 14.4 删除软件包及其依赖程序(RPM) 14.5 升级软件包及其依赖程序(RPM) 14.6 查找可供下载的软件包(RPM) 14.7 安装软件包(DEB) 14.8 删除软件包(DEB) 14.9 安装软件包及其依赖程序(DEB) 14.10 删除软件包及其依赖程序(DEB) 14.11 升级软件包及其依赖程序(DEB) 14.12 查找可供下载的软件包(DEB) 14.13 清除不再需要的安装包(DEB) 14.14 处理APT相天的错误(DEB)