转:Bash特性

时间:2011-6-2     作者:smarteng     分类: 服务器相关


这些应该属于Bash特性.

不废话了.开始

首先大家几乎都会的



1.

[^^ SharkShow]# !!          

!!两个感叹号是执行最后一个命令的意思.



一般运行完一个程序后忘记加

sudo报错咋办?



普通人:↑键.←键弄到最前面加上sudo.然后回车

高手    :  Ctrl+p.调出上一条命令Ctrl+a去最前面加上sudo然后回车

春哥    :  sudo !!



这几个方法实现目的都一样.款式不一样.我个人觉得越简便越迅速的就是最好的



!!其实是!-1也就是最后一条命令.!-2就是倒数第二个命令

[^
^ SharkShow]# ls

LinuxTone

[^^ SharkShow]# pwd

/root

[^
^ SharkShow]# !-2

ls

LinuxTone

这样使用后记录到history的将会是ls而不是!-2

!-2属于引用符.

也可以结合着反撇号使用比如ls !-1 效果等于ls !!也等于ls PWD 



2.



情况打错字母:

[^^ SharkShow]# ls /ect/passwd 

ls: /ect/passwd: 没有那个文件或目录

[^
^ SharkShow]#



这情况.没用Tab很自信的一路敲.回车后发现etc打成ect了报错了.

普通人:如上

高手   :也成普通人了.

春哥   :^ect^etc^ 然后回车

作用就是将上一个命令的ect替换成etc然后执行.但是这个命令只替换顺序找到的第一个.

^^也属于引用符.也可以写成^ect^etc  省略最后一个^符.

这个也相当于

!!:s/ect/etc

替换上个命令的ect为etc



3.

另外一个情况打错两个地:

[^^ SharkShow]# ls /ect/passwd /ect/shadow

ls: /ect/passwd: 没有那个文件或目录

ls: /ect/shadow: 没有那个文件或目录

[^
^ SharkShow]#

一不小心打错两个

用^^的方式也只能替换第一个匹配的



普通人 :看春哥的

高手     :春哥

春哥     :!!gs/ect/etc    加上g替换上个命令出现的所有ect为etc



其实上个情况!!:s/ect/etc一出来很多人就感觉很眼熟了.和vim里的替换.sed里的替换差不多.

我一开始也是这样的.所以我就试了下!!:s/ect/etc/g报错.

这里和vim和sed的区别就是这个g是放在前面的.放在后面不行.



4.

如何使用快捷键调用上个或者更上个命令的全部命令名参数或者选项.

我个人觉得这个就是如何使用上个命令的位置变量似的.

以下所有说的    Alt+xxx  是键盘组合快捷键.切勿单纯



情况如下:

用户说ftp目录进不去.



[^^ SharkShow]# ls -lhd /var/ftp/pub/               

drwx------ 2 root root 4.0K 2007-12-13 /var/ftp/pub/

[^
^ SharkShow]#

查看了下没有权限.怎么办.chmod呗.

普通人 : ↑键上去改阿

高手     :  难道用!!:s//替换?我觉得很复杂阿

春哥     :  输入chmod 755 按 Alt+. 就行了ALT+.是快捷键直接就把/var/ftp/pub给调用出来了.



Alt+.就代表上个命令的最后一个位置变量.

我所谓的位置变量是感觉.实际是不是这样我不知道.希望有人告诉我.

这回这个是比较短的路径做示范.长路径就更体现出来效率了.



5.

普通人问:那如果有两个目录情况如下呢

[^^ SharkShow]# ls -lhd /var/ftp/pub/ /var/ftp/

drwxr-xr-x 3 root root 4.0K 06-01 02:28 /var/ftp/

drwxr-xr-x 2 root root 4.0K 2007-12-13 /var/ftp/pub/

[^
^ SharkShow]#



我想用chmod只改变/var/ftp/pub这个目录的权限.我用Alt+.变成/var/ftp了



春哥 : 问的好.

这个情况可以先使用Alt+[数字] 决定使用上个命令的哪个位置变量(类似于位置变量具体应该是Bash特性.个人较浅)



还记得位置变量吗.复习下吧.

$0 = 命令名称  $1 =  第一个参数或者选项 $2 = 第二个参数或者选项 .一直到9.如果你键盘带10 11 12我不知道好使不.

现在这个情况需要使用的位置参数是/var/ftp/pub/对吧.也就是第2个.因为ls属于命令也属是$0  -lhd属于$1也是第1个.

就先输入chmod 755 按快捷键alt+2 . 然后再按ALT+.调用的就是你所希望的参数了.

按过之后提示符会有变化大家自己看

结果就是这样了

[^_^ SharkShow]# chmod 755 /var/ftp/pub/



其实这些已经可以很效率的完成某些操作了.

接下来继续..




6.

如何使用编辑器来编辑命令.

快捷键Ctrl+x按完之后再按Ctrl+e会呼出你指定的编辑器.

实现这个需要调用一个SHELL环境变量.由这个变量来指定使用的编辑器.

列子我就使用vim编辑器了.它默认也会有一个编辑器.我反正是进去没能找到退出来的方法最后直接换控制台pkill -u tty1.

这个变量是EDITOR后面指定你想使用的编辑器.

export EDITOR=vim

然后就会进入你指定的vim编辑器

输入完后保存退出会自动执行.

是不是屌爆了...

谷歌查找到:

实际上这是readline库功能在默认情况下.Bash使用的是emacs模式的命令操作方式

<CTRL -x CTRL -e>是调用这个功能的一个绑定.如果你习惯使用vi模式.按ESC也可以实现同样功能



7.



还记得第5个学的那个不.不记得翻上去看看.那个是使用快捷键实现的.还要按两次感觉挺麻烦.

[^^ SharkShow]# ls -lhd /var/ftp/pub/ /var/ftp/

drwxr-xr-x 3 root root 4.0K 06-01 02:28 /var/ftp/

drwxr-xr-x 2 root root 4.0K 2007-12-13 /var/ftp/pub/

[^
^ SharkShow]# 

就是这个.当我们想使用第二个位置变量/var/ftp/pub/的时候还得先alt+2在alt+.是不是好麻烦.

那翔哥就来提供另外一个方法.别纠结春哥去哪了.



使用命令的方式调用上个命令位置变量2的参数

[root@localhost ~]# chmod 000 !!:2

chmod 000 /var/ftp/pub/

[root@localhost ~]#

解释:!!:2就相当调用上个命令的第二个位置变量也就是/var/ftp/pub/ 实现了改权限



改完权限后在用察看刚才修改的目录权限.拓展出这个

[root@localhost ~]# ls -lhd !!:$

ls -lhd /var/ftp/pub/

d--------- 2 root root 4.0K 2007-12-13 /var/ftp/pub/

[root@localhost ~]#



解释:!!:$ 代表调用上个命令的最后一个位置变量内容.     SHELL脚本里的位置变量只能用到$9(不知道是不是一马事)



[root@localhost ~]# echo 1 2 3 4 5 6 7 8 10 11 12 13

1 2 3 4 5 6 7 8 10 11 12 13

[root@localhost ~]# echo !!:$

echo 13

13

[root@localhost ~]# ls !!:0

ls echo



那如果是!!:^的意思就是调用上个命令第一个位置变量.而不是命令名称echo而是1

由此在引出一个使用方法

[root@localhost ~]# echo 1 2 3 4 5 6 7 8 10 11 12 13

1 2 3 4 5 6 7 8 10 11 12 13

[root@localhost ~]# echo !!:1-5

echo 1 2 3 4 5

1 2 3 4 5

[root@localhost ~]#

如果想使用上个命令的位置变量到结尾可以

!!:1-$

想使用上个命令的开头到第五个[注:可不是echo 而是:1 如果想用echo开头往后5个应该是 !!:0-5]

!!:^-5



在附加几个用法

[root@localhost ~]# echo Linux.wo.le.ge.cao

Linux.wo.le.ge.cao

[root@localhost ~]# !!:0 !!:$:r

echo Linux.wo.le.ge

[root@localhost ~]#

解释如下:

!!:0           !!:$:r

echo   Linux.wo.le.ge

!!:$:r上面都看完了这个应该就知道了.调用上个命令的最后一个参数并把他后面的.cao给取消掉





[root@localhost ~]# ls -lhd /usr/local/apache2

drwxr-xr-x 15 root root 4.0K 05-31 14:13 /usr/local/apache2

[root@localhost ~]# ls -lhd !!:$:h

ls -lhd /usr/local

drwxr-xr-x 13 root root 4.0K 05-31 14:30 /usr/local

[root@localhost ~]#



这个解释一下.!!:$:h 把上个命令的最后一个位置变量内容前面带/后的内容脸/一起删除掉.



!!:^:h就相当于从第一个位置变量开始碰到/就把连同/到后面的都删除掉如下

drwxr-xr-x 13 root root 4.0K 05-31 14:30 /usr/local

[root@localhost ~]# ls -lhd !!:^:h

ls -lhd -lhd

drwxr-x--- 16 root root 4.0K 06-01 10:21 .

[root@localhost ~]#





8.

凑个吉利.最后一个

我是个很喜欢简略操作的人.越快捷越喜欢.效率也高吧哈哈.

因为最近上课学到服务.经常要修改主配置文件.因为重要需要备份一份.

比如apache的主配置文件做示范.是源码安装方式的



一般操作先登录到主配置存放的目录下.在用cp复制一份:

[root@localhost ~]# cd /usr/local/apache2/conf/

[root@localhost conf]# cp httpd.conf httpd.bak

[root@localhost conf]# ls

extra  httpd.bak  httpd.conf  magic  mime.types  original

[root@localhost conf]#

更弱惨了得方法就是

[root@localhost ~]# cp /usr/local/apache2/conf/httpd.conf http.bak

[root@localhost ~]# ls

http.bak  LinuxTone

[root@localhost ~]#

一不小心对吧.这个成备份到当前的家目录里了.



下面教大家一个哈.

[root@localhost ~]# cp /usr/local/apache2/conf/httpd.conf{,.bak}

[root@localhost ~]# ls /usr/local/apache2/conf/

extra  httpd.conf  httpd.conf.bak  magic  mime.types  original

[root@localhost ~]#

这个命令执行时就相当于这样吧.

cp /usr/local/apache2/conf/httpd.conf  /usr/local/apache2/conf/httpd.conf.bak



下面在分享几个自己使用的时候发现与文档中写的不同的东西.



比如输入了串命令.

用Ctrl+u可以剪切.书上只写了Ctrl+u是删除.

用Ctrl+y可以粘贴.这个是自己试的.

用Ctrl+p这个上面说过了.是调用上整个命令相当于↑键.

用Ctrl+l 清屏等于clear等于tput clear.

我所谓的剪切粘贴只是感觉.不是真实的那种右键可以粘贴出来的.也许书上说的意思是删除还原.

在登录的时候因为输入密码看不到位数.不确定前面输的对不对的时候也可以使用Ctrl+u剪切掉重新输入.



由上面得同时引出.Vim编辑器里的

dd也是剪切.

末行模式: 10,20d剪切第10到第20行

p还是粘贴





我以为Linux下ping 命令默认持续ping是因为默认就加了-a呢

没想到-a是个单独的选项如果ping 通会发出 滴滴滴滴的响声.

a=audible ping

只局限于用Linux主机ping.如果想知道你的服务器重启多久才会起来.

可以用台Linux虚拟机桥接.然后Ping你的服务器.

如果你觉得响声太慢.可以加-i 参数后面跟时间

比如我的电脑ping -ai 0.000001 192.168.1.1

a和i别写反了i后面就得跟时间了.

怎么样听到服务器呼唤你的声音了吧.



最后一个关于安全的.

我明天就该上安全的课了.书上教的方法是

在.bash_logout 里写上history -c这样即使有用的也被清掉了.不咋方便

下面这个变量值的条件决定哪些不记录到history里.不记录到这里面退出时也不会记录到~/.bash_history里

这样有些明文的密码也不会被非法获得了.

我下面这个变量的情况.是命令前面加空格后就不记录到history中.剩下的是英文文档我也看不懂.

export HISTIGNORE="[ ]

如果还要写其他条件用冒号分开.入="[]
:&"