LinuxSir.Org  
| 网站首页 | 注册账号 | 论坛帮助 |

欢迎来到LinuxSir.Org!
您还未登录,请登录后查看论坛,或者点击论坛上方的注册链接注册新账号。


发表新主题 回复
精华主题  
主题工具
旧 04-04-05, 19:10 第 1 帖
home_king
 
home_king 的头像
 
 
临时退役版主  
  注册日期: Mar 2003
  帖子: 2,759
  精华: 15
 

标题: Bash的命令行编辑


搜索了一下版区的旧帖,发现只有一个帖子涉及到命令行编辑,而且不怎么全面。我在这里总结一下。

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

Bash命令行编辑的默认模式是交互式emacs模式。
切换可用模式或关闭模式:
代码:
set -o emacs #设置emacs模式 set -o vi #设置vi模式 bash -noediting #关闭命令行编辑
要注意的是,命令行编辑的快捷键与UNIX终端接口设置的控制键存在潜在的不协调。我会在相关命令加以说明。

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

1. 基本emacs模式命令
代码:
CTRL-b # 光标向前移动一个字符 CTRL-f # 光标向后移动一个字符 DEL # 向后删除一个字符 CTRL-d # 向前删除一个字符。注意,命令行为空时,CTRL-D会退出登录!
2. 单词命令 (以单词作为操作单位有时侯更方便些; 这些是复合命令,方法是按下ESC键后,再按一个字母)
emacs用"删除环"来作为"删除内容"的回收站。
这里的单词被定义为字母数字序列。
这里的条目可以是删除了的单词,句子或文本块。
代码:
ESC-b # 向后移动一个单词 ESC-f # 向前移动一个单词 CTRL-w # 向后删除一个单词 ESC-d # 向前删除一个单词 CTRL-y # 恢复删除环中最后一个条目 ESC-p # 恢复删除环中的上一个条目 ESC-n # 恢复删除环中的下一个条目
3. 行命令
代码:
CTRL-a # 移动到行首 CTRL-e # 移动到行尾 CTRL-k # 向前删除到行尾
4. 在命令历史文件中移动
代码:
CTRL-p # 调出上一条命令 CTRL-n # 调出下一条命令 CTRL-r # 递增交互式查找历史命令 ESC-< # 调出历史文件的第一条命令 ESC-> # 调出历史文件的最后一条命令
这里值得说明的是CTRL-r这条命令。类似emacs的递增查找,它会随着你的键入在历史命令文件中实时进行查找工作。键入CTRL-r后,在行首出现(reverse-i-search)`':。
举例如下:
代码:
[root@home root]# id uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) (reverse-i-search)`id': id # 这时候有两种选择。 # 若按下Enter确认 [root@home root]# id uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) # 若想退出,按CTRL-g [root@home root]#

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

4.文字完成
emacs模式一个最重要的特性式其文字完成功能。
代码:
TAB # 众所周知,这是最重要的文字完成快捷键,它试图执行文本的一般性完成 ESC-? # 列出所有可能的完成 ESC-/ # 试图进行文件名而非函数或命令的完成
TAB和ESC-?的区别是当遇到可选项时,按两次TAB才能实现ESC-?的功能。
其实还有很多其他的文字完成快捷键,不过都不常用,就不列出了。

5.杂项命令
代码:
CTRL-m # 等同于RETURN CTRL-l # 清除屏幕,等同于clear命令 CTRL-o # 等同于RETURN,随后显示命令历史中的下一个命令 CTRL-t # 颠倒光标左右的两个字符 ESC-t # 颠倒光标左右的两个单词 CTRL-u # 删除当前行 CTRL-v # 引用插入,这就是"转义快捷键" CTRL-[ # 等同于ESC ESC-c # 光标处单词首字母大写 ESC-u # 光标处单词大写 ESC-l # 光标处单词小写 ESC-. # 在光标后插入前面命令行中的最后一个单词
CTRL-o对于执行命令序列很有用。
CTRL-v可以把复合键转义,比如键入CTRL-m,就变成^M。
执行操作对象为同一个文件的命令序列,而且该文件的路径冗长时,ESC-.很有用,举例如下:
代码:
[root@home root]# cat /usr/share/apps/kit/kitui.rc ... [root@home root]# more # 按ESC-.,自动补足上一个命令行的最后一个单词(路径名) [root@home root]# more /usr/share/apps/kit/kitui.rc
Tip: 再按一下ESC-.,则会显示出再上一条历史条目,如此类推。







__________________
IBOX, a LiveCD distribution based on Gentoo, is fit for newbie.

IBOX brings to you:
- knoppix-style harddisk installation tool, by which you can install Gentoo in 20 minutes.
- hardware auto-configuration. You can run into X desktop directly.
- all-round software set, including OpenOffice, azureus.
- LiveCD-create-tools. Step-by-step, custom a LiveCD yourself with ease.

Any questions and feedbacks is welcome to home_king at 163 dot com

此帖于 04-05-05 22:03 被 home_king 编辑.
  home_king 当前离线   回复时引用此帖
旧 04-04-05, 19:48 第 2 帖
KornLee
 
 
 
★☆★☆★☆★  
  注册日期: Nov 2002
  我的住址: LinuxWorld
  帖子: 6,960
  精华: 61
 

我用ksh,常用ESC+K/J翻历史命令,用ESC+==命令补齐
  KornLee 当前离线   回复时引用此帖
旧 04-04-05, 21:36 第 3 帖
yongjian
 
yongjian 的头像
 
 
★版☆主★  
  注册日期: May 2003
  我的住址: Linux
  帖子: 2,572
  精华: 9
 

ksh用的就是vi模式。







__________________
15" C2D MBP.
有简单的,不用复杂的!看到复杂的,尽量简单化!
Unix/Linux Philosophy: Be small! Be concentrated! One program does one thing and do it perfectly!
∞ years - 宇宙中最后的物质 Proton heat death. 之后,宇宙将以纯能量的形式永远存在。。。一切皆空
  yongjian 当前离线   回复时引用此帖
旧 04-04-05, 22:28 第 4 帖
home_king
 
home_king 的头像
 
 
临时退役版主  
  注册日期: Mar 2003
  帖子: 2,759
  精华: 15
 

哪位爱好vi的同志把vi模式补上呢?谢谢~~
  home_king 当前离线   回复时引用此帖
旧 04-04-05, 23:21 第 5 帖
KornLee
 
 
 
★☆★☆★☆★  
  注册日期: Nov 2002
  我的住址: LinuxWorld
  帖子: 6,960
  精华: 61
 

下面是vi在ksh的commandline下常用的快捷键
代码:
命令 功能 在历史文件中移动 ESC_K或+ 上移历史文件 ESC_J后- 下移历史文件 G 移到历史文件的第一行 nG 移动历史文件中的第n行找串 /string 向上搜索历史文件 ? 向下搜索历史文件 在一行中移动 h 在一行中左移 l 在一行中右移 b 移到一个单词后面 e/w 移到一个单词前面 ^/0 移到一行的第一个字符开头 $ 移到行尾
vi在编辑过程中的常用方法,论坛里有很多,可以搜索得到!

此帖于 04-04-05 23:47 被 KornLee 编辑.
  KornLee 当前离线   回复时引用此帖
旧 04-04-05, 23:36 第 6 帖
home_king
 
home_king 的头像
 
 
临时退役版主  
  注册日期: Mar 2003
  帖子: 2,759
  精华: 15
 

好,javalee是个ksh迷,呵呵。

同样是为了高效利用shell,我再带出一些很有趣的命令。
代码:
man -k <command> # 等效于命令apropos,查找有什么命令可用 man -f <command> # 等效于命令whatis ,询问命令的用途 man N <command> # 根据上面两个命令找到的man章节,指定数字N,查看command第N章的man手册 alias # 查看系统上的别名 alias <command>='<command> -option' # 设置你的别名 alias <command> # 查看具体命令的别名设置 type <command> # 查找命令的出处(按优先级查找:别名,关键词,函数,内置命令,脚本或可执行程序) whereis <command> # 查找内置命令,脚本或可执行程序,类似命令type -path <command>,此外还寻找man手册路径 enable -p # 显示所有内置命令列表
举例如下:
代码:
[root@home root]# man -k mount autofs (5) - Format of the automounter maps automount (8) - configure mount points for autofs /etc/auto.master [auto] (5) - Master Map for automounter /etc/init.d/autofs [autofs] (8) - Control Script for automounter mdu (1) - display the amount of space occupied by an MSDOS directory mklost+found (8) - create a lost+found directory on a mounted Linux second extended file system mmount (1) - mount an MSDOS disk mount (2) - mount and unmount filesystems mount (8) - mount a file system mountain (1) - random 3D plots that look vaguely mountainous ppmshift (1) - shift lines of a portable pixmap left or right by a random amount ppmspread (1) - displace a portable pixmap's pixels by a random amount rpc.mountd [mountd] (8) - NFS mount daemon rpc.mountd [rpc] (8) - NFS mount daemon setup (2) - setup devices and file systems, mount root file system showmount (8) - show mount information for an NFS server sleep (1) - delay for a specified amount of time triangle (1) - random mountains using iterative subdivision of triangles umount (8) - unmount file systems umount [mount] (2) - mount and unmount filesystems usermount (1) - A graphical tool to mount, unmount and format filesystems [root@home root]# man -f mount mount (2) - mount and unmount filesystems mount (8) - mount a file system [root@home root]# man 8 mount [root@home root]# alias alias cp='cp -i' alias l.='ls -d .* --color=tty' alias ll='ls -l --color=tty' alias ls='ls --color=tty' alias mv='mv -i' alias pwd='cd ~;pwd' alias rm='rm -i' alias vi='vim' alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde' [root@home root]# alias ls alias ls='ls --color=tty' [root@home root]# alias wget='wget -c' [root@home root]# alias wget alias wget='wget -c' [root@home root]# type if if is a shell keyword [root@home root]# type -path wget /usr/bin/wget [root@home root]# whereis wget wget: /usr/bin/wget /usr/share/man/man1/wget.1.gz

此帖于 04-04-06 12:18 被 home_king 编辑.
  home_king 当前离线   回复时引用此帖
旧 04-04-05, 23:49 第 7 帖
KornLee
 
 
 
★☆★☆★☆★  
  注册日期: Nov 2002
  我的住址: LinuxWorld
  帖子: 6,960
  精华: 61
 

说到命令行补齐,看看bash和ksh的比较:
代码:
/home/javalee:bash /home/javalee:ex ex example_to_doc++ exit export extensionproxy ex1 exec expand expr extractres /home/javalee:ksh /home/javalee:ex 1) /usr/bin/ex 7) exit 2) /bin/ex 8) /usr/bin/expand 3) /home/javalee/myshell/ex1 9) export 4) /home/javalee/myshell/ex1 10) /usr/bin/expr 5) /usr/bin/example_to_doc++ 11) /usr/bin/extensionproxy 6) exec 12) /usr/bin/extractres /home/javalee:ex
  KornLee 当前离线   回复时引用此帖
旧 04-04-05, 23:54 第 8 帖
KornLee
 
 
 
★☆★☆★☆★  
  注册日期: Nov 2002
  我的住址: LinuxWorld
  帖子: 6,960
  精华: 61
 

说到man,那么就不得不提man中的数字,也许你知道,也许你不知道 ,
代码:
1 命令 命令的使用方法,可以使用的参数等。 2 系统调用 只有系统才能执行的函数 3 库调用 大多是 libc 函数,如 qsort(3) 4 特殊文件 文件在 /dev 中。 文件的格式,比如 /etc/passwd 及其他可读文件。 6 游戏 7 宏命令包和约定 一些描述,关于标准文件系统设计、网络协议,ASCII 和 其他字符编码、man page (手册页)和其他。 8 系统管理命令 诸如 mount(8) 之类的命令,多数只有 root 可以执行。 9 内核程序
  KornLee 当前离线   回复时引用此帖
旧 04-04-05, 23:54 第 9 帖
home_king
 
home_king 的头像
 
 
临时退役版主  
  注册日期: Mar 2003
  帖子: 2,759
  精华: 15
 

呵呵,ksh挺不错的。除了bash是第一之外,就轮到ksh了吧。呵呵~~~
  home_king 当前离线   回复时引用此帖
旧 04-04-06, 01:10 第 10 帖
yongjian
 
yongjian 的头像
 
 
★版☆主★  
  注册日期: May 2003
  我的住址: Linux
  帖子: 2,572
  精华: 9
 

那我就来试试吧。有不周之处,还请修正和补全。
其实,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模式。多练练把!
  yongjian 当前离线   回复时引用此帖
旧 04-04-06, 01:19 第 11 帖
KornLee
 
 
 
★☆★☆★☆★  
  注册日期: Nov 2002
  我的住址: LinuxWorld
  帖子: 6,960
  精华: 61
 

标题: vim --help


代码:
/home/javalee:vim --help VIM - Vi IMproved 6.1 (2002 Mar 24, compiled Aug 27 2002 19:07:13) 用法:vim [参数] [文件 ..] 编辑指定的文件 或:vim [参数] - 从标准输入(stdin)读取文本 或:vim [参数] -t tag 编辑时使用指定的 tag 或:vim [参数] -q [errorfile] 编辑时加载第一个错误 参数: -- 只有在这之后的文件 -v Vi 模式 (同 "vi") -e Ex 模式 (同 "ex") -s 安静 (batch) 模式 (只能与 "ex" 一起使用) -d Diff 模式 (同 "vimdiff", 可迅速比较两文件不同处) -y 简易模式 (同 "evim", modeless) -R 只读模式 (同 "view") -Z 限制模式 (同 "rvim") -m 不可修改 (写入文件) -M 文本不可修改 -b 二进制模式 -l Lisp 模式 -C 'compatible' 传统 Vi 兼容模式 -N 'nocompatible' 不完全与传统 Vi 兼容,可使用 Vim 加强能力 -V[N] Verbose 等级 -D 调试模式 -n 不使用交换文件, 只使用内存 -r 列出交换文件后退出 -r (加文件名) 恢复上次崩溃的资料(Recover crashed session) -L 与 -r 一样 -H Start in Hebrew mode -F Start in Farsi mode -T <terminal> 设定终端为 <terminal> -u <vimrc> 使用 <vimrc> 替换任何 .vimrc --noplugin 不加载任何 plugin -o[N] 打开 N 个窗口 (预设是每个文件一个) -O[N] Like -o but split vertically + 启动后跳到文件结尾 +<lnum> 启动后跳到第 <lnum> 行 --cmd <command> 加载任何 vimrc 前执行 <command> -c <command> 加载第一个文件后执行 <command> -S <session> 加载第一个文件后载入 Session 文件<session> -s <scriptin> 从 <scriptin> 读入一般模式命令 -w <scriptout> 对文件 <scriptout> 附加(append)所有输入的命令 -W <scriptout> 对文件 <scriptout> 写入所有输入的命令 -x 编辑编码过的文件 -i <viminfo> 使用 <viminfo> 而非 .viminfo -h Print Help (this message) and exit --version Print version information and exit
用vi直接在命令行里修改文件:example:
代码:
vim -e -s -c ":%s/aaa/bbb/g" -c ":wq!" filename
ps:在bash里,用光标键真的很厉害 uparrow/downarrow翻阅历史文件,leftarrow/rightarrow移动,修改命令行里的命令,这一点要比ksh强多了
  KornLee 当前离线   回复时引用此帖
旧 04-04-06, 01:22 第 12 帖
yongjian
 
yongjian 的头像
 
 
★版☆主★  
  注册日期: May 2003
  我的住址: Linux
  帖子: 2,572
  精华: 9
 

嗯, javalee兄提到了命令补齐,我就象补充一下。并不是所由的ksh都能获得如javalee兄显示的效果。在AIX下, ksh的补齐功能就很差。命令的显示和补齐只能是当前目录或是已输入了路径的命令的补齐。不能向bash那样,只要是PATH路径中的命令都能补。不知道怎样配置才能到到Linux下ksh的效果。
  yongjian 当前离线   回复时引用此帖
旧 04-04-07, 03:08 第 13 帖
yongjian
 
yongjian 的头像
 
 
★版☆主★  
  注册日期: May 2003
  我的住址: Linux
  帖子: 2,572
  精华: 9
 

刚学到的:
tar cf >(gzip -v9cf >dir.tar.gz) dir/
  yongjian 当前离线   回复时引用此帖
旧 04-04-07, 03:24 第 14 帖
KornLee
 
 
 
★☆★☆★☆★  
  注册日期: Nov 2002
  我的住址: LinuxWorld
  帖子: 6,960
  精华: 61
 

在ksh里,按一下ESC,再按ctrl+V,会出现ksh的版本
home/javalee:PD KSH v5.2.14 99/07/13.2
  KornLee 当前离线   回复时引用此帖
旧 04-04-07, 09:27 第 15 帖
home_king
 
home_king 的头像
 
 
临时退役版主  
  注册日期: Mar 2003
  帖子: 2,759
  精华: 15
 

引用:
最初由 yongjian 发表
刚学到的:
tar cf >(gzip -v9cf >dir.tar.gz) dir/
这就是"进程替换"。
tar cf <target file> directorys
>(gzip -v9cf >dir.tar.gz)表示把tar cf将dir/打包后的输出连接到(gzip -v9cf >dir.tar.gz)这个子shell进程的输入中去。
  home_king 当前离线   回复时引用此帖
发表新主题 回复


主题工具

发帖规则
您 [不可以] 发表新主题
您 [不可以] 回复主题
您 [不可以] 上传附件
您 [不可以] 编辑您的帖子

已 [启用] BB 代码
已 [启用] 表情符号
已 [启用] IMG 代码
已 [禁用] HTML 代码
[论坛跳转…]


所有时间均为[北京时间]。现在的时间是 12:27


Powered by vBulletin 版本 3.6.8
版权所有 ©2000 - 2010, Jelsoft Enterprises Ltd.
官方中文技术支持: vBulletin 中文
版权所有 ©2002 - 2009, LinuxSir.Org