首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

9.5  操作命令行

本节内容包括字补全、命令行编辑和拼写校正。

9.5.1  字补全

如果用户允许,那么TC Shell将在命令行上执行文件名、命令和变量名的自动补全。在tcsh中,用来统称这些特性的术语是字补全。

1. 文件名补全

当用户指定一个唯一的文件名前缀后,TC Shell可以补全该文件名。文件名补全类似于文件名生成,但是文件名补全的目标是选择单个文件。两者一起使得使用更具有描述性的较长文件名变得实用。

在命令行上输入文件名时,为了使用文件名补全,应输入该文件名足够多的部分(以在该目录下唯一标识该文件),然后按下TAB键。tcsh补充该文件名并添加一个空格符,然后移动光标,这样用户就可以输入其他参数或者是按下RETURN键。在下面的示例中,用户输入命令cat trig1A并按下TAB键,系统补充了以trig1A开头的文件名的剩余部分:

tcsh $ cat trig1A —>TAB —> cat triglA.302488 ■

如果有两个或者更多文件名匹配用户输入的前缀,而用户没有提供更多的信息,那么tcsh将不能补全这个文件名。如果可能,shell将试图通过添加字符使前缀的长度达到最大,并且发出蜂鸣声,以提醒用户需要输入更多信息以消除模糊:

tcsh $ ls h*

help.hist he1p.trig01 help.txt

tcsh $ cat h —> TAB —> cat help. (beep)

用户在补充了足够的字符以消除模糊之后,可以再次按下TAB键。另外,用户还可以按下CONTROL+D组合键使tcsh显示匹配文件名的列表:

tcsh $ cat help. —> CONTROL-D

help.hist    he1p.trig01 help.txt

tcsh $ cat help. ■

在显示这些文件名之后,tcsh将命令行重新打出来,这样用户就可以消除文件名模糊(通过再次按下TAB键)或者手动完成文件名的输入。

2. 代字符补全

TC Shell分析出现在字首部的代字符(~),并试图在用户输入TAB键的时候将其扩展成一个用户名:

tcsh $ cd ~a1 —> TAB —> cd ~a1ex/—> RETURN

tcsh $ pwd

/home/alex

通过追加一个斜杠(/),tcsh指出已补全的字是一个目录。斜杠也使继续指定路径名变得容易。

3. 命令补全和变量补全

对命令名和变量名均可以使用与列出和补全文件名相同的机制。除非用户给出完整的路径名,否则shell使用变量path试图补全命令名。被列出的候选项可能位于不同目录下。

tcsh $ up —> TAB (beep) —> CONTROL-D

up2date             updatedb             uptime

up2date-config     update-mime-database

up2date-nox         updmap

tcsh $ up —> t —> TAB —> uptime ■ —> RETURN

9:59am up 31 days, 15:11, 7 users, load average: 0.03, 0.02, 0.00

如果像下面这个示例中一样,设置了autolist变量,那么在按下TAB键调用自动补全时shell将自动列出候选项。这样用户就不必按下CONTROL+D组合键。

tcsh $ set autolist

tcsh $ up —> TAB(beep)

up2date              updatedb             uptime

up2date-config       update-mime-database

up2date-nox          updmap

tcsh $ up —> t —> TAB —> uptime ■ —> RETURN

10:01am up 31 days, 15:14, 7 users, load average: 0.20, 0.06, 0.02

如果将autolist设置为ambiguous,shell将只在用户所输入的字是一组命令中的最长前缀时,按下TAB键才会列出候选项。否则,按下TAB键将使得shell向这个字添加一个或者多个字符,直到它成为最长前缀,然后再次按下TAB键将列出候选项:

tcsh $ set autolist=ambiguous

tcsh $ echo $h —> TAB (beep)

histfile history home

tcsh $ echo $h■ —> i —> TAB —> echo $hist■ —> TAB

histfile history

tcsh $ echo $hist■ —> o —> TAB —> echo $history ■ —> RETURN

1000

shell必须根据某个字在输入行中的上下文来判断该字是一个文件名、用户名、命令或者是变量名。输入行的第1个字被假设是命令名。如果字以特殊字符$开头,那么这个字就被认为是变量名,等等。在下面的示例中,第2个which命令没有正常工作:字up的上下文使其看上去像某个文件名的开头而不是某条命令的开头。TC Shell为which提供一个updates(不可执行文件)参数,which显示一条错误消息:

tcsh $ ls up*

updates

tcsh $ which updatedb ups uptime

/usr/bin/updatedb

/usr/1ocal/bin/ups

/usr/bin/uptime

tcsh $ which up —> TAB —> which updates

updates: Command not found.

9.5.2  编辑命令行

bindkey  tcsh命令行编辑特性类似于bash。用户可以使用emacs模式命令(默认)或者vim模式命令。使用bindkey -v切换到vim模式命令,而使用bindkey -e切换到emacs模式命令。在两种模式下,方向键都被绑定到明显的移动命令上,这样用户可以在其历史列表中来回(上下)滚动,还可以在当前命令行上左右移动。

如果不带任何参数,内置命令bindkey将显示编辑器命令与可在键盘上输入的按键序列之间的当前映射:

tcsh $ bindkey

Standard key bindings

"^@"                  -> set-mark-command

"^a"                   ->  beginning-of-line

"^b"                  ->  backward-char

"^c"                   ->  tty-sigintr

"^d"                -> delete-char-or-list-or-eof

...

Multi-character bindings

"^[[A"                 -> up-history

"^[[B"                 -> down-history

"^[[C"              -> forward-char

"^[[D"               -> backward-char

"^[[E"                -> beginning-of-line

"^[[F"                 -> end-of-line

...

Arrow key bindings

down                 -> down-history

up                   -> up-history

left                 -> backward-char

right               -> forward-char

home                -> beginning-of-line

end                  -> end-of-line

^表示CONTROL字符(^B=CONTROL+B)。^[表示META或者ALT字符,在输入该键的下一个字符的同时按下META或者ALT键。如果没有进行替换,或者所使用的键盘没有META和ALT键,就按下ESCAPE键并释放,然后输入下一个字符。对于^[[F,要按下META+[或者ALT+[组合键,后面跟着F键或者按下ESCAPE [ F。down/up/left/right表示方向键,home/end表示数字键盘上的HOME和END键。

这个示例在用户处于emacs模式时给出了bingkey的输出。切换到vi(m)模式(bindkey -v)并给出另一条bindkey命令将显示vi(m)键绑定。可以使用管道将bindkey的输出发送到less,以便于列表的阅读。

9.5.3  校正拼写

可以让tcsh试图校正命令名、文件名以及变量(但只使用emacs形式的键绑定)的拼写。拼写校正只发生两次,即在输入RETURN之前和输入RETURN之后。

1. 在输入RETURN之前

为了让tcsh在用户输入RETURN之前纠正某个字,用户必须指出希望这样做。用于这个目的两个功能为spell-line和spell-word:

$ bindkey | grep spell

"^[$"            -> spell-line

"^[S"                -> spell-word

"^[s"            -> spell-word

bindkey的输出显示spell-line被绑定到META-$(ALT-$或者ESCAPE-$),spell-word被绑定到META-S和META-s(ALT-s或者ESCAPE s和ALT-S或者ESCAPE S)。要想校正光标左边的字的拼写,输入META-S。输入META-$将调用spell-line功能,试图校正命令行中的所有字:

tcsh $ ls

bigfile.gz

tcsh $ gunzipp —> META-s —> gunzip bigfele.gz> META-s—> gunzip bigfile.gz

tcsh $ gunzip bigfele.gz —> META-$ —> gunzip bigfile.gz

tcsh $ ecno $usfr —> META-$ —> echo $user

2. 在输入RETURN之后

名为correct的变量控制着在用户输入RETURN之后且在把命令行传递给被调用命令之前tcsh将要试图校正和补全的内容。如果没有设置correct,tcsh将不校正任何内容:

tcsh $ unset correct

tcsh $ ls morning

morning

tcsh $ ecno $usfr morbing

usfr: Undefined variable.

shell报告变量名错误而不是命令名错误,这是因为shell在执行命令之前扩展变量。如果用户给出一个不带任何参数的错误命令名,shell报告这是一个错误的命令名。

将correct设置为cmd会使shell只校正命令,而设置为all将校正命令、变量和文件名,设置为complete将补全命令:

tcsh $ set correct = cmd

tcsh $ ecno $usfr morbing

CORRECT>echo $usfr morbing (y|n|e|a)? y

usfr: Undefined variable.

tcsh $ set correct = all

tcsh $ echo $usfr morbing

CORRECT>echo $user morning (y|n|e|a)? y

alex morning

当correct设置为cmd时,tcsh将命令名ecno校正为echo。当correct设置为all,tcsh将同时校正命令名和变量。而如果命令行上出现文件名,它还试图校正该文件名。

进行自动拼写检查时显示一个特殊的提示符,让用户选择,输入y接受被修改的命令行,输入n拒绝,输入e进行编辑,或者输入a取消命令。参见第9.6.7节中的prompt3部分中关于拼写检查中使用的特殊提示符的讨论。

在下面的示例中,在设置correct变量之后,用户将ls命令的名字拼写错误,tcsh提示了一个纠正的命令名。因为tcsh给出的替换命令并不是ls,所以用户选择编辑这个命令行。shell将光标移动到命令之后,这样用户就可以纠正这个错误:

tcsh $ set correct=cmd

tcsh $ lx -1 —> RETURN (beep)

CORRECT>lex -1 (y|n|e|a)? e

tcsh $ 1x -l■

如果将值complete指派给变量correct,tcsh将试图按照与文件名补全相同的方式进行命令名补全。在下面的示例中,在将correct的值设置为complete之后,用户输入命令up。shell响应为Ambiguous command,这是因为有几个命令均以这两个字母开头但是它们的第3个字母不同。然后shell重新显示命令行。用户此时可以输入TAB键,这样就可以得到一个以up开头的命令的列表,然后输入t并输入RETURN。因为这3个字母唯一标识了uptime工具,所以shell补全了这条命令:

tcsh $ set correct = complete

tcsh $ upRETURN

Ambiguous command

tcsh $ up —> tRETURN —> uptime

4:45pm up 5 days, 9:54, 5 users, load average: 1.62, 0.83, 0.33

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论