看了几篇shell技巧连载, 发现几个geek东东, 记录如下:
1.以SUDO运行上条命令
$ sudo !!
两个感叹号其实是bash的一个特性,称为事件引用符(event designators)。!!其实相当于!-1,引用前一条命令,当然也可以!-2,!-50。默认情况下bash会在~/.bash_history 文件内记录用户执行的最近500条命令,history命令可以显示这些命令。
关于事件引用符的更多用法可以深入阅读 The Definitive Guide to Bash Command Line History。
2..在以普通用户打开的VIM当中保存一个ROOT用户文件
:w !sudo tee %
常常忘记了sudo就直接用vim编辑/etc内的文件,(不过也不一定,vim发现保存的文件无法保存时候会提示)等编辑好了,保存时候才发现没权限。曲线方法是先保存个临时文件,退出后再sudo cp回去。不过实际上在vim里面可以直接完成这个过程的,命令就是如此。
查阅vim的文档(输入:help :w),会提到命令:w!{cmd},让vim执行一个外部命令{cmd},然后把当前缓冲区的内容从stdin传入。
tee是一个把stdin保存到文件的小工具。而%,是vim当中一个只读寄存器的名字,总保存着当前编辑文件的文件路径。
3. 替换上一条命令中的一个短语
$ ^foo^bar^
又是另外一个事件引用符(event designator),可以把上一条命令当中的foo替换成bar。
在需要重复运行调试一道长长的命令,需要测试某个参数时候,用这个命令会比较实用;但多数人会首先选择按上箭头提出上道命令,再移动光标去修改某参数,这样更直观,但效率上就不够使用引用符高,而且在脚本中用这个方法可以简化很多。
这道命令的原始样式应该是这样的:
!!:s/foo/bar/
本文一开始介绍过!!,后面的一段大家应该很熟悉,如果需要替换每一个foo的话, 就用!!:gs/foo/bar, vim、sed的替换操作都是这样的语法。
4.抓取LINUX桌面的视频
$ ffmpeg -f x11grab -s wxga -r 25 -i :0.0 -sameq /tmp/out.mpg
我们在一些视频网站上看到别人的3D桌面怎么怎么酷的视频,通常就是这么来的,ffmpeg可以直接解码X11的图形,并转换到相应输出格式。
ffmpeg的通常用法是,根据一堆参数,输出一个文件[ 编码格式根据输出文件取],输出文件通常放最后,下面解析下几个参数:
-f x11grab 指定输入类型。因为x11的缓冲区不是普通的视频文件可以侦测格式,必须指定后ffmpeg才知道如何获得输入。
-s wxga 设置抓取区域的大小。wxga是1366*768的标准说法,也可以换成-s 1280×800的写法。
-r 25 设置帧率,即每秒抓取的画面数。
-i :0.0 设置输入源,本地X默认在0.0
-sameq 保持跟输入流一样的图像质量,以用来后期处理。[如果嫌文件比较大的话可以用 -b 800k 替换此参数, 800k表示码率]
至于其他ffmpeg的用法,可以参考下面两篇文章:
How to Extract Audio Tracks from YouTube Videos
Converting YouTube Flash Videos to a Better Format with ffmpeg
[ 在我的机器上, 用ffmpeg -f x11grab -s 1280x800 -sameq -r pal -i :0.0 /tmp/out2.avi 这些参数捕获码率大约为5000Kb, 也就是一分钟占40MB左右的空间, 还可以接受 ]
5. 用你最喜欢的编辑器来敲命令
command
在已经敲完的命令后按 ,会打开一个你指定的编辑器(比如vim,通过环境变量$EDITOR指定),里面就是你刚输入的命令,然后爱怎么编辑就怎么编辑吧,特别是那些参数异常 复杂的程序,比如mencoder/ffmpeg,一个命令动辄3、4行的,要修改其中的参数,这个方法最合适不过了,保存退出后自动执行这个程序。
实际上这是readline库的功能,在默认情况下,bash使用的是emacs模式的命令行操作方式, 是调用这个功能的一个绑定。如果你习惯使用vi模式,按 可以实现同样功能。
如果你喜欢别的编辑器,可以在~/.bashrc里面放上比如export EDITOR=vim的命令。
6. bash 中ESC妙用 [ 修改自: http://linux.net527.cn/Linuxwendang/Linuxwendang//15470.html ]
{esc}{点号} : 最有用的用过是这个, 意思是在当前光标所在位置,补上上一个命令的最后一个参数, ATL+. 也一样能完成这个功能, 如果想取第n个参数的话, 就按 {Esc + n}{Esc + .}
{esc}{backspace} : 快速清除当前行输入
{esc}{2}{e} : 重复输入2个字母e, 如果要输入100个e,就可以这样: {esc}{1}{0}{0}{e},哈哈.
{esc}{t} : 命令参数大挪移, 比如现在已经输入了 ab cd efg 然后光标停留在最后面,按下{esc}{t}之后,得到的是 ac efg cd,光标所在处的单词,会往前一个,哈哈,好玩吧
7. 实时某个目录下查看最新改动过的文件
watch -d -n 1 'df; ls -FlAt /path'
在使用这条命令时你需要替换其中的 /path 部分,watch 是实时监控工具,-d 参数会高亮显示变化的区域,-n 1 参数表示刷新间隔为 1 秒。
df; ls -FlAt /path 运行了两条命令,df 是输出磁盘使用情况,ls -FlAt 则列出 /path 下面的所有文件
8. 通过 DNS 来读取 Wikipedia 的词条,太geek了!
dig +short txt .wp.dg.cx
这也许是最有趣的一条技巧了,David Leadbeater 创建了一个 DNS 服务器,通过它当你查询一个 TXT 记录类型时,会返回一条来自于 Wikipedia 的简短的词条文字,这是他的介绍。
9. 查看ASCII码表
man 7 ascii
很多人初学编程都会接触到ascii码的概念,有时候为了查某个符号的ascii值,可能还得翻箱倒柜找出当年的课本?Linux Manpage里面其实包含了很多类似的实用资料,上述命令就能很详细的方式解释ascii编码,当然这里还有在线版。
man命令的第二个参数是区域码,用来区分索引词的范围,比如printf,在C标准库里面的printf跟bash当中的printf是不同的, 前者的查询是man 3 printf,后者是man 1 printf。如果这个区域码省略,就会从1开始搜索,直到找到为止。
命令man man可以看到详细的解释。
manpages里面还有一些有趣而且实用的资料,可能鲜为人知:
man 1 intro – 一篇对从未接触过Linux的用户的简明教程。
man 2 syscalls – 内核系统请求的列表,按内核版本注释分类,系统编程必备。
man 2 select_tut – 关于select()系统请求的教程。
man 3 string – 在头文件内的所有函数。
man 3 stdio – 关于头文件的使用,标准输入/输出库的说明。
man 3 errno – 所有errorno的取值及说明。(C语言内类似其他语言的异常告知机制)
man 4 console_codes – Linux的终端控制码及其使用解释。
man 4 full – 介绍/dev/full这个总是处于”满”状态的磁盘。(对应/dev/null这个总是空的设备)
man 5 proc – 介绍/proc下的文件系统。
man 5 filesystems – 各种Linux文件系统。
第7区里面的资料通常最酷:
man 7 bootparam – 详细解释内核启动参数。
man 7 charsets – 解释各种语言的编码集。(gbk,gb2312等)
man 7 glob – 解释glob文件名管理机制的工作过程。
man 7 hier – 解释Linux文件系统结构各个部分的作用。
man 7 operator – C语言的运算符的列表。
man 7 regex – 介绍正则表达式。
man 7 suffixes – 常见文件后缀名的列表跟解释。
man 7 time – Linux的时钟机制解释。
man 7 units – 数值单位及其数值的解释。
man 7 utf8 – 描述UTF-8编码。
man 7 url – 解释URL、URI、URN等的标准。
10. 巧用read阻塞给烧开水计时, 哈哈
time read
当点上火时执行这个命令, 然后水烧开时再按一下回车, realtime就是时间啦~
11. 在终端上看星球大战
telnet towel.blinkenlights.nl 一个字, 真牛!
12. 加密单工电话
你跟对方讲话
dd if=/dev/dsp | ssh username@host dd of=/dev/dsp
或者
你自言自语
dd if=/dev/dsp | dd of=/dev/dsp
这种直接读设备的方式不能做到同时读写dsp, 建议使用alsa系列工具代替: arecord and aplay, 那么自言自语就可以
arecord | aplay
geek一点, 如果你想听一个jpg文件的声音, 哈哈 你可以
cat test.jpg | aplay
别把speeker开的太大声, 否则邻居还以为有外星人说话呢
哈哈