LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 9942|回复: 19

Shell的命令行编辑[vi&emacs命令行技巧征集]

[复制链接]
发表于 2004-4-5 19:10:16 | 显示全部楼层 |阅读模式
搜索了一下版区的旧帖,发现只有一个帖子涉及到命令行编辑,而且不怎么全面。我在这里总结一下。

Bash的命令行编辑是区别于其他shell如csh的一个特色,它使得命令的输入就像在emacs或vi里编辑文件一样便捷,尤其对于一些冗长且复杂的命令的构造。熟练命令行编辑主要是为了使系统管理高效化。

Bash命令行编辑的默认模式是交互式emacs模式。
切换可用模式或关闭模式:

  1. set -o emacs     #设置emacs模式
  2. set -o vi        #设置vi模式
  3. bash -noediting  #关闭命令行编辑
复制代码

要注意的是,命令行编辑的快捷键与UNIX终端接口设置的控制键存在潜在的不协调。我会在相关命令加以说明。

由于我不熟悉vi模式,所以只好给出我熟悉的emacs模式。希望vi强的兄弟补上。

1. 基本emacs模式命令

  1. CTRL-b  # 光标向前移动一个字符
  2. CTRL-f  # 光标向后移动一个字符
  3. DEL       # 向后删除一个字符
  4. CTRL-d  # 向前删除一个字符。注意,命令行为空时,CTRL-D会退出登录!
复制代码

2. 单词命令 (以单词作为操作单位有时侯更方便些; 这些是复合命令,方法是按下ESC键后,再按一个字母)
emacs用"删除环"来作为"删除内容"的回收站。
这里的单词被定义为字母数字序列。
这里的条目可以是删除了的单词,句子或文本块。

  1. ESC-b          # 向后移动一个单词
  2. ESC-f          # 向前移动一个单词

  3. CTRL-w       # 向后删除一个单词
  4. ESC-d          # 向前删除一个单词

  5. CTRL-y         # 恢复删除环中最后一个条目
  6. ESC-p          # 恢复删除环中的上一个条目
  7. ESC-n          # 恢复删除环中的下一个条目
复制代码


3. 行命令

  1. CTRL-a   # 移动到行首
  2. CTRL-e   # 移动到行尾
  3. CTRL-k   # 向前删除到行尾
复制代码


4. 在命令历史文件中移动

  1. CTRL-p   # 调出上一条命令
  2. CTRL-n   # 调出下一条命令
  3. CTRL-r   # 递增交互式查找历史命令
  4. ESC-<    # 调出历史文件的第一条命令
  5. ESC->    # 调出历史文件的最后一条命令
复制代码

这里值得说明的是CTRL-r这条命令。类似emacs的递增查找,它会随着你的键入在历史命令文件中实时进行查找工作。键入CTRL-r后,在行首出现(reverse-i-search)`':。
举例如下:

  1. [root@home root]# id
  2. uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
  3. (reverse-i-search)`id': id
  4. # 这时候有两种选择。
  5. # 若按下Enter确认
  6. [root@home root]# id
  7. uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
  8. # 若想退出,按CTRL-g
  9. [root@home root]#
复制代码


这种递增交互命令查找很方便我们寻找一些复杂命令,尤其当历史列表中命令条目很多的时候。

4.文字完成
emacs模式一个最重要的特性式其文字完成功能。

  1. TAB     # 众所周知,这是最重要的文字完成快捷键,它试图执行文本的一般性完成
  2. ESC-?  # 列出所有可能的完成
  3. ESC-/   # 试图进行文件名而非函数或命令的完成
复制代码

TAB和ESC-?的区别是当遇到可选项时,按两次TAB才能实现ESC-?的功能。
其实还有很多其他的文字完成快捷键,不过都不常用,就不列出了。

5.杂项命令

  1. CTRL-m                 # 等同于RETURN
  2. CTRL-l                 # 清除屏幕,等同于clear命令
  3. CTRL-o                 # 等同于RETURN,随后显示命令历史中的下一个命令
  4. CTRL-t                  # 颠倒光标左右的两个字符
  5. ESC-t                    # 颠倒光标左右的两个单词
  6. CTRL-u                  # 删除当前行
  7. CTRL-v                  # 引用插入,这就是"转义快捷键"
  8. CTRL-[                   # 等同于ESC
  9. ESC-c                   # 光标处单词首字母大写
  10. ESC-u                   # 光标处单词大写
  11. ESC-l                    # 光标处单词小写
  12. ESC-.                     # 在光标后插入前面命令行中的最后一个单词
复制代码

CTRL-o对于执行命令序列很有用。
CTRL-v可以把复合键转义,比如键入CTRL-m,就变成^M。
执行操作对象为同一个文件的命令序列,而且该文件的路径冗长时,ESC-.很有用,举例如下:

  1. [root@home root]# cat /usr/share/apps/kit/kitui.rc
  2. ...
  3. [root@home root]# more
  4. # 按ESC-.,自动补足上一个命令行的最后一个单词(路径名)
  5. [root@home root]# more /usr/share/apps/kit/kitui.rc
复制代码

Tip: 再按一下ESC-.,则会显示出再上一条历史条目,如此类推。
发表于 2004-4-5 19:48:50 | 显示全部楼层
我用ksh,常用ESC+K/J翻历史命令,用ESC+==命令补齐 ;)
发表于 2004-4-5 21:36:32 | 显示全部楼层
ksh用的就是vi模式。
 楼主| 发表于 2004-4-5 22:28:18 | 显示全部楼层
哪位爱好vi的同志把vi模式补上呢?谢谢~~
发表于 2004-4-5 23:21:13 | 显示全部楼层
下面是vi在ksh的commandline下常用的快捷键
  1. [color=red]
  2. 命令                        功能[/color][color=blue]
  3. 在历史文件中移动[/color]
  4. ESC_K或+                        上移历史文件
  5. ESC_J后-                        下移历史文件
  6. G                        移到历史文件的第一行
  7. nG                        移动历史文件中的第n行找串
  8. /string                        向上搜索历史文件
  9. ?                        向下搜索历史文件[color=blue]
  10. 在一行中移动[/color]
  11. h                        在一行中左移
  12. l                        在一行中右移
  13. b                        移到一个单词后面
  14. e/w                        移到一个单词前面
  15. ^/0                        移到一行的第一个字符开头
  16. $                        移到行尾
复制代码
vi在编辑过程中的常用方法,论坛里有很多,可以搜索得到!
 楼主| 发表于 2004-4-5 23:36:42 | 显示全部楼层
好,javalee是个ksh迷,呵呵。

同样是为了高效利用shell,我再带出一些很有趣的命令。

  1. man -k <command>  # 等效于命令apropos,查找有什么命令可用
  2. man -f <command>   # 等效于命令whatis ,询问命令的用途
  3. man N <command>   # 根据上面两个命令找到的man章节,指定数字N,查看command第N章的man手册
  4. alias                          # 查看系统上的别名
  5. alias <command>='<command> -option'  # 设置你的别名
  6. alias <command>       # 查看具体命令的别名设置
  7. type <command>      # 查找命令的出处(按优先级查找:别名,关键词,函数,内置命令,脚本或可执行程序)
  8. whereis <command>      # 查找内置命令,脚本或可执行程序,类似命令type -path <command>,此外还寻找man手册路径
  9. enable -p                   # 显示所有内置命令列表
复制代码

举例如下:

  1. [root@home root]# man -k mount
  2. autofs               (5)  - Format of the automounter maps
  3. automount            (8)  - configure mount points for autofs
  4. /etc/auto.master [auto] (5)  - Master Map for automounter
  5. /etc/init.d/autofs [autofs] (8)  - Control Script for automounter
  6. mdu                  (1)  - display the amount of space occupied by an MSDOS directory
  7. mklost+found         (8)  - create a lost+found directory on a mounted Linux second extended file system
  8. mmount               (1)  - mount an MSDOS disk
  9. mount                (2)  - mount and unmount filesystems
  10. mount                (8)  - mount a file system
  11. mountain             (1)  - random 3D plots that look vaguely mountainous
  12. ppmshift             (1)  - shift lines of a portable pixmap left or right by a random amount
  13. ppmspread            (1)  - displace a portable pixmap's pixels by a random amount
  14. rpc.mountd [mountd]  (8)  - NFS mount daemon
  15. rpc.mountd [rpc]     (8)  - NFS mount daemon
  16. setup                (2)  - setup devices and file systems, mount root file system
  17. showmount            (8)  - show mount information for an NFS server
  18. sleep                (1)  - delay for a specified amount of time
  19. triangle             (1)  - random mountains using iterative subdivision of triangles
  20. umount               (8)  - unmount file systems
  21. umount [mount]       (2)  - mount and unmount filesystems
  22. usermount            (1)  - A graphical tool to mount, unmount and format filesystems
  23. [root@home root]# man -f mount
  24. mount                (2)  - mount and unmount filesystems
  25. mount                (8)  - mount a file system
  26. [root@home root]# man 8 mount
  27. [root@home root]# alias
  28. alias cp='cp -i'
  29. alias l.='ls -d .* --color=tty'
  30. alias ll='ls -l --color=tty'
  31. alias ls='ls --color=tty'
  32. alias mv='mv -i'
  33. alias pwd='cd ~;pwd'
  34. alias rm='rm -i'
  35. alias vi='vim'
  36. alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
  37. [root@home root]# alias ls
  38. alias ls='ls --color=tty'
  39. [root@home root]# alias wget='wget -c'
  40. [root@home root]# alias wget
  41. alias wget='wget -c'
  42. [root@home root]# type if
  43. if is a shell keyword
  44. [root@home root]# type -path wget
  45. /usr/bin/wget
  46. [root@home root]# whereis wget
  47. wget: /usr/bin/wget /usr/share/man/man1/wget.1.gz
复制代码
发表于 2004-4-5 23:49:36 | 显示全部楼层
说到命令行补齐,看看bash和ksh的比较:
  1. /home/javalee:bash
  2. /home/javalee:ex
  3. ex                example_to_doc++  exit              export            extensionproxy
  4. ex1               exec              expand            expr              extractres
  5. /home/javalee:ksh
  6. /home/javalee:ex
  7. 1) /usr/bin/ex                          7) exit
  8. 2) /bin/ex                              8) /usr/bin/expand
  9. 3) /home/javalee/myshell/ex1            9) export
  10. 4) /home/javalee/myshell/ex1           10) /usr/bin/expr
  11. 5) /usr/bin/example_to_doc++           11) /usr/bin/extensionproxy
  12. 6) exec                                12) /usr/bin/extractres
  13. /home/javalee:ex
复制代码
发表于 2004-4-5 23:54:01 | 显示全部楼层
说到man,那么就不得不提man中的数字,也许你知道,也许你不知道 ;),
  1. 1 命令
  2. 命令的使用方法,可以使用的参数等。
  3. 2 系统调用
  4. 只有系统才能执行的函数
  5. 3 库调用
  6. 大多是 libc 函数,如 qsort(3)
  7. 4 特殊文件
  8. 文件在 /dev 中。
  9. 文件的格式,比如
  10. /etc/passwd 及其他可读文件。
  11. 6 游戏
  12. 7 宏命令包和约定
  13. 一些描述,关于标准文件系统设计、网络协议,ASCII 和 其他字符编码、man page (手册页)和其他。
  14. 8 系统管理命令
  15. 诸如 mount(8) 之类的命令,多数只有 root 可以执行。
  16. 9 内核程序
复制代码
 楼主| 发表于 2004-4-5 23:54:43 | 显示全部楼层
呵呵,ksh挺不错的。除了bash是第一之外,就轮到ksh了吧。呵呵~~~:p
发表于 2004-4-6 01:10:33 | 显示全部楼层
那我就来试试吧。有不周之处,还请修正和补全。
其实,CLI下的vi模式和用vi编辑文件大致是一样的。这里我大致的总结一下:
A. vi有两种模式, 一种是命令模式(Command Mode), 另一种是编辑模式(Edit Mode)。 从编辑模式转到命令模式用Esc键, 从命令模式转到编辑模式有几种转法:
                  i. a键, 在当前光标后进入编辑。
                  ii. i键, 在当前光标处进入编辑。
                  iii. A键, 在当前行的末尾进入编辑。
                  iv. I键, 在当前行的头进入编辑。
                  o键和O键在命令行下没有作用。
B. 起用命令行下的vi模式: set -o vi (可以将其加入到profile/bashrc等启动文件中)

VI的具体命令介绍:

1. 命令模式之移动(Command mode of navigating)
k, j, h, l : 上(命令历史中的上一个命令), 下(命令历史中的下一个命令), 左(光标在当前行左移), 右(光标在当前行右移)。
Ctrl-H: 左移
0(数字0): 光标移到当前行的头
$:光标移到行前行末尾。
w, b : 向前,向后移动一个字(word)
e:向后移动到字的最后。
E:向后移动到字段的末尾,以空格/tab区分。
Ctrl-F, Ctrl-B: 向前, 向后翻滚一屏。
Ctrl-D, Ctrl-U: 向前,向后翻滚半屏。

2. 命令模式之搜寻(Command mode of seraching)
Esc+k : 调出上次运行的命令(继续按k键,就可向上翻滚命令历史,j键向下翻滚)
/pattern :从历史命令中查找以‘pattern’为命令名的命令。(如/ifconfig,如果历史命令中有ifconfig, 它将显示最近的一个。)
n: 找到了相映的命令后,继续历遍下一个相映的命令。(如历史命令中记录了3个ifconfig命令,/ifconfig和n可以一次地历遍这三个命令,以便找到最想要的那个。)
N: 向下历遍。

3. 编辑模式
s: 删除当前光标下的字同时进入编辑模式等待输入。
S:删除当前的一整行同时进入编辑模式。
x: 删除当前光标下的字但不进入编辑,可以按x继续删除光标后的字。
X: 删除当前光标前的字但不进入编辑,可以按X继续删除光标前的字。
u: undo
y: 拷贝当前行的内容到缓冲。
p:复制拷贝的内容到当前行。
v: 进入vi的文本编辑模式。多用于编写短小的script时用。

前面已经介绍了从命令模式进入编辑模式的方法,这里给几个简单的例子:
shell> ifconfig eth9 192.168.0.1 netmask 255.555.255.0 up
假设你输入了这样的一个命令并enter执行了。但是由于输入错误,你想要回去修改并再执行一遍。步骤:
1. Esc+k 回到这个命令
2. 你可以按l(小写L)一个字母一个字母地移动到eth9处,也可以按w一个词移动,或按e一个词移动到词的末尾。(移动的方法很多,自己可以找处最快的组合)
3. 当光标在9字上时, 你可以按s键将9删掉,同时进入编辑,马上输入正确的数字; 你也可以按x键,在按i键先删除再进入编辑...(删除并编辑的方法也很多,找到最适合你的方法)
4.Esc回到Command mode, 继续下行到555处,更改第一个5为2。
5.enter执行。
一个短小的命令可以练习使用强大的VI模式。多练练把!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表