日期:2014-05-16  浏览次数:20646 次

最牛B的Linux Shell命令 系列连载:(二)

编者按

本文编译自commandlinefu.com的系列文章Top Ten One-Liners from CommandLineFu Explained 。作为一个由用户推荐最有用shell命令的网站,其记录了数以万计的各色shell命令,其中不乏相当实用和有趣的,本文就要细数当中获投票最高的一些命令,从其中取材并加以细释,希望读者能从中受益。

编辑:@BOYPT BOYPT

1.用你最喜欢的编辑器来敲命令

1
command
 <
CTRL-x CTRL-e>

在已经敲完的命令后按<CTRL-x CTRL-e> ,会打开一个你指定的编辑器(比如vim,通过环境变量$EDITOR 指定),里面就是你刚输入的命令,然后爱怎么编辑就怎么编辑吧,特别是那些参数异常复杂的程序,比如mencoder/ffmpeg,一个命令动辄3、4行的,要修改其中的参数,这个方法最合适不过了,保存退出后自动执行这个程序。

实际上这是readline库 的功能,在默认情况下,bash使用的是emacs模式的命令行操作方式,<CTRL-x CTRL-e> 是调用这个功能的一个绑定。如果你习惯使用vi模式,按<ESC v> 可以实现同样功能。

如果你喜欢别的编辑器,可以在~/.bashrc里面放上比如export EDITOR=nano 的命令。

另外一个修改命令的方法是使用fc 命令(Fix Command),在编辑器里面打开上一句命令。我们的第一辑连载 提过一个^foo^bar^ 命令可以用fc来实现:fc -s foo=bar

2.清空或创建一个文件

1
>
 file.txt

> 在shell里面是标准输出重定向符,即把(前部个命令的)命令行输出转往一个文件内,但这里没有“前部命令”,输出为空,于是就覆盖(或创建)成一个空文件了。

有些脚本的写法是:>file.txt ,因为: 是bash默认存在的空函数。

单纯创建文件也可以用$touch file.txt ,touch本来是用作修改文件的时间戳,但如果文件不存在,就自动创建了。

3.用ssh创建端口转发通道

1
ssh
 -N
 -L2001:remotehost:80
 user@
somemachine

这个命令在本机打开了2001端口,对本机2001端口的请求通过somemachine 作为跳板,转到remotehost 的80端口上。

实现效果跟术语反向代理 是相似的,实际上就是端口转发,注意上面的描述涉及了3台主机,但当然somemachine可以变成localhost。

这个命令比较抽象,但有时候是很有用的,比如因为众所周知的原因国内的IP的80端口无法使用,又或者公司的防火墙只给外网开了ssh端口,需要访问内部服务器一个web应用,以及需要访问某些限定了来源IP的服务,就可以用上这个方法了。

举一个具体例子,运行:

1
2
ssh
 -f
 -N
 -L
 0.0.0.0:443
:twitter.com:443
 shell.cjb.net
ssh
 -f
 -N
 -L
 0.0.0.0:80
:twitter.com:80
 shell.cjb.net

然后在/etc/hosts里面添加127.0.0.1 twitter.com ,好吧剩下的你懂的。

当然通常做这个功能的反向代理,应该要用squid、nginx之类,ssh就算是轻量级的尝试吧!

4.重置终端

1
reset

如果你试过不小心cat了某个二进制文件,很可能整个终端就傻掉了,可能不会换行,没法回显,大堆乱码之类的,这时候敲入reset回车,不管命令有没有显示,就能回复正常了。

实际上reset 命令只是输出了一些特殊字符,我们看BusyBox里面最简单的reset程序的实现:

1
printf
(
"