当前位置: 首页 > 工具软件 > Geek Editor > 使用案例 >

【转】shell's geek trick

沈皓君
2023-12-01

看了几篇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开的太大声, 否则邻居还以为有外星人说话呢

哈哈

 类似资料: