天天看点

Bash功能与使用技巧

 Bash功能与使用技巧

目录:

历史命令

命令别名

管道与重定向

常用快捷键

作业控制

花括号扩展

一个完整计算机的体系结构包括:硬件与软件,而软件又分为系统软件与应用软件,负责对硬件仅需管理与操作的是系统软件的内核部分,用户是无法与硬件或内核打交道的,用户通过应用程序或部分系统软件发出指令(可能是通过浏览器发送一封邮件),这些指令会被翻译并传给内核,内核在得知用户的需求后调度硬件资源来完成操作(比如,使用网卡发送数据包)。在Linux环境下,我们一般通过Shell来与内核交流,并最终实现我们想要使用计算机资源的目的。由于Linux的开放性特点,使得在Linux下对Shell的选择也很多,CentOS 6.3系统中可以使用的Shell有/bin/sh、/bin/bash、/bin/tcsh、/bin/csh这几种,/etc/shells文件说明了当前系统有哪些可用的Shell。不同的Shell有不同的特点以及操作方式,我们这里以CentOS默认使用的Shell为讲解案例即Bash。

1.2    BASH功能介绍

1.2.1  命令历史

Bash拥有自动记录命令历史的功能,用户所执行的命令会在注销时自动记录到自己家目录下的.bash_history 这样一个隐藏文件中。查看这些命令历史记录的方法有很多,可以通过直接打开文件来查看,也可以通过键盘的上下键来上翻或下翻历史记录,还可以通过history命令查看历史记录,所有的命令历史都有记录编号。命令历史能够记录的信息数量由HISTSIZE变量所决定,CentOS 6.3默认通过/etc/profile文件定义了HISTSIZE=1000,也就是最多可以记录最近所使用的1000条命令,当有第1001条命令执行时第一条命令会被覆盖,执行history -c命令可以清空所有的历史记录。

记录命令历史的除了可以查看历史记录外,还可以在需要时直接调用历史记录再次执行该命令:

1.上下键翻阅历史命令,找到合适的命令后直接回车即可执行。

2. 输入!string调用命令历史(string为关键字),如!vim将调用最后一次执行的以vim开头的命令。或者通过!n来准确定位历史记录,如!242将直接调用命令历史的第242条记录并执行。

3. 通过Ctrl+r快捷键打开搜索功能,接着输入关键字即可在命令历史中搜索相关命令,回车完成执行操作。如果没有搜索到适合的命令按ESC键退出搜索。

1.2.2  命令别名

在CentOS 6.3系统中我们可以直接使用ll命令来显示文件的详细信息,其实系统中并没有ll这样一个命令,它仅是被提前定义好的一个别名而已,别名的好处是可以把本来很长的指令简化缩写,为常用且复杂的命令及选项创建别名可以大大提高日常工作效率。

  1. [root@centos6 ~]# alias                           #查看系统当前所有别名 
  2. alias cp='cp -i' 
  3. alias l.='ls -d .* --color=auto' 
  4. alias ll='ls -l --color=auto' 
  5. alias ls='ls --color=auto' 
  6. alias mv='mv -i' 
  7. alias rm='rm -i' 
  8. [root@centos6 ~]# alias h5=’head -5’              #定义新的别名 
  9. [root@centos6 ~]# unalias h5                      #取消别名定义 

1.2.3  管道与重定向

Bash的标准输入设备是键盘、鼠标、手写板等设备,标准输出为显示器,一般我们通过键盘输入命令并执行,系统将返回信息显示在屏幕上,默认不管是正确的还是错误的信息都将输出至显示器。标准输入的文件描述符为0,标准输出的文件描述符为1,错误输出的文件描述符为2。但有时我们需要改变这样的标准输入与输出方式,Linux中我们可以使用重定向符(<、>、<<、>>、|)重新定义输入与输出。

管道使得我们可以将多条命令连接在一起使用,它的作用是将一个命令的标准输出重定向给下一个命令并作为该命令的标准输入。例如,使用ifconfig eth0 | grep ‘inet addr’命令过滤包含IP地址的行,ifconfig本身会输出大量网络接口的信息,由于这里使用了管道符号(|)所以ifconfig命令的所有输出都将作为grep命令的输入内容,最终实现过滤包含IP地址的行。

对于标准的输出信息是输出至显示器,而有时你可能并不需要这些输出信息,又或者是暂时不需要在屏幕上看到这些信息;另外对于输入一般是通过键盘输入,而有时你或许希望可以从文件中读取输入信息。输出重定向可以使用>或>>符号,使用>可以将输出导入至文件,如果文件不存在则创建该文件,如果文件已经存在则会覆盖该文件的内容;而使用>>可以将输出追加至文件;另外,对应错误信息的重定向需要使用2>或2>>符号实现。输入重定向可以使用<符号,它可以可以帮助我们从文件中提取输入信息。

以下通过几个简单的实例演示重定向的使用方法:

  1. [root@centos6 ~]# rpm -qa |grep gcc                    #查询计算机中是否安装了gcc软件 
  2. [root@centos6 ~]# echo “pass” | passwd --stdin tom    #设置tom的密码为pass 
  3. [root@centos6 ~]# ls                                   #查看当前文件列表 
  4. anaconda-ks.cfg    install.log        install.log.syslog 
  5. [root@centos6 ~]# ls > list.txt                        #将输出保存至list.txt,屏幕无输出 
  6. [root@centos6 ~]# hostname >> list.txt                 #将主机名追加至list.txt文件末尾 
  7. [root@centos6 ~]# mail -s test [email protected] < list.txt #发送邮件,邮件内容来自文件 
  8. [root@centos6 ~]# ls -l abc install.log                #查看文件详细信息,abc并不存在 
  9. ls: cannot access abc: No such file or directory 
  10. -rw-r—r--. 1 root root 9064 Dec 4 09:30 install.log 
  11. [root@centos6 ~]# ls -l abc install.log 2> error.txt   #仅将错误重定向,不影响正确输出 
  12. -rw-r—r--. 1 root root 9064 Dec 4 09:30 install.log 
  13. [root@centos6 ~]# ls -l abc install.log > all 2>&1     #标准输出与错误输出均导入至all 
  14. [root@centos6 ~]# ls -l abc install.log >> all 2>&1    #标准输出与错误输出均追加至all 
  15. [root@centos6 ~]# ls -l abc install.log &> all         #标准输出与错误输出均导入至all 

1.2.4  快捷键

Bash准备了大量的快捷键为用户使用,熟练掌握这些快捷键的全部或部分会使你在工作中受益颇多,开始的时候你可能需要花费大量的时间来记忆这些快捷键,但一旦你记住了他们,你的工作效率会直线上升。下面列出了常用的快捷键及其功能描述。

  1. 快捷键     功能描述 
  2. Ctral+a    光标移动至行首 
  3. Ctrl+e     光标移动至行尾 
  4. Ctrl+f     光标右移一个字符 
  5. Ctrl+b     光标左移一个字符 
  6. Ctrl+l     清屏,等同于clear命令 
  7. Ctrl+u     删除光标至行首的字符 
  8. Ctrl+k     删除光标至行尾的字符 
  9. Ctrl+c     终止进程 
  10. Ctrl+z     挂起进程(可以通过jobs命令查看挂起的进程) 
  11. Ctrl+w     删除光标前一个单词(以空格为分割符) 
  12. Alt+d     删除光标后一个单词 
  1. [root@centos6 ~]# echo "pass" | passwd --stdin root >/dev/null 
  1. [root@centos6 ~]# id tom >> user 2>> error 
  1. [root@centos6 ~]# echo {a,b,c} 
  2. a b c 
  3. [root@centos6 ~]# echo user{1,5,8} 
  4. user1 user5 user8 
  5. [root@centos6 ~]# echo {0..10} 
  6. 0 1 2 3 4 5 6 7 8 9 10 
  7. [root@centos6 ~]# echo {0..10..2} 
  8. 0 2 4 6 8 10 
  9. [root@centos6 ~]# echo a{2..-1} 
  10. a2 a1 a0 a-1 
  11. [root@centos6 ~]# mkdir /tmp/{dir1,dir2,dir3} 
  12. [root@centos6 ~]# ls -ld /tmp/dir{1,2,3} 
  13. [root@centos6 ~]# chmod 777 /tmp/dir{1,2}

继续阅读