TCSH Shell 的特性

作者:Jesper K. Pedersen

在本文中,我将描述 TCSH 的一些主要特性,我认为这些特性使其值得作为主要的登录 Shell 使用。本文并非旨在说服 bash 用户更改。我从未使用过 bash,因此对它知之甚少。

你们中的一些人知道,我创建了一个名为 Dotfile Generator 的配置工具,网址为 http://www.imada.ou.dk/~blackie/dotfile/,它可以配置 TCSH。我相信这个工具对于充分利用 TCSH 非常方便,而无需多次阅读手册。因此,我将在本文中多次提及此工具,以展示如何使用它来设置 TCSH。

为什么 Shell 如此重要?

Shell 是您执行程序、管理文件和目录等的接口。尽管很少有人意识到,但他们每天都在工作中频繁使用 shell,例如,完成文件名、使用历史记录替换和别名。TCSH shell 提供了所有这些功能以及更多功能,但普通用户很少对其进行优化。

通过高度了解 shell 的强大功能,您可以减少在 shell 中花费的时间,并增加花费在原始任务上的时间。

命令行补全

几乎所有 shell 用户都使用的一个重要特性是 命令行补全。使用此功能,您无需键入文件名的所有字母,只需键入不明确的字母即可。这意味着,如果您希望编辑名为 file.txt 的文件,您可能只需键入 fi 并按 TAB 键,shell 将为您键入文件名的其余部分。

基本上,可以在文件和目录上使用补全。这意味着您不能在主机名、进程 ID、给定程序的选项等上使用补全。使用这种类型的补全,您无法做的另一件事是在键入命令 cd 的参数时补全目录名。

在 TCSH 中,补全机制得到了增强,因此可以告诉 TCSH 使用哪个列表来补全特定命令。例如,您可以告诉 TCSH 对于命令 rloginping,从主机名列表进行补全。另一种选择是告诉它仅在命令为 cd 时才在目录上进行补全。

要使用 Dotfile Generator (TDG) 配置用户定义的补全,请转到 TDG 页面 completion -> userdefined;这将弹出一个页面,如图 1 所示。

图 1. TDG 补全/用户定义页面

对于命令名称,您告诉 TDG 您希望为哪个命令定义补全。在本例中,它是 rm

接下来,您必须告诉 TDG 此补全适用于命令的哪些参数。为此,请按标有 Position definition 的按钮。这将弹出一个页面,该页面分为两部分,如图 2 和图 3 所示。

图 2. TDG 位置定义页面

在第一部分中,您告诉 TDG 应该从要补全的参数索引(即按下 TAB 键的位置)定义的位置定义。在这里,您可以告诉它您希望在第一个参数、除第一个参数之外的所有参数等等上进行补全。

2066f3.gif图 3. TDG 模式定义页面

“位置相关补全”的替代方案是“模式相关补全”。这意味着您可以告诉 TDG 只有当当前单词、前一个单词或前一个单词之前的单词符合给定模式时,此补全才应适用。

现在您必须告诉 TDG 从哪个列表进行补全。为此,请按标有 List 的按钮。这将弹出一个页面,您可以在其中从许多不同的列表中进行选择,例如,别名、用户名或目录。

文件和目录

您可以从中选择的四个列表是 Commands, Directories, File namesText files。如果您选择其中一个,则仅使用该目录中的元素。

预定义列表

有两种方法可以指定从预定义列表进行补全。一种是标记选项 predefined list,并在该列表中键入所有选项。

如果列表在多个位置使用(例如,主机名列表),则此解决方案不是一个好主意。在这种情况下,应选择要位于变量中的列表,然后在 .tcshrc 文件中设置此变量。

来自命令的输出

在许多情况下,列表应在补全发生时进行 计算。例如,位于给定主机上的用户列表或 makefile 中的目标将需要计算。

要设置这样的补全,首先开发返回要从中补全的列表的命令。该命令必须在标准输出上返回补全列表,作为空格分隔的列表。完成后,将此命令插入到条目 Output From Command 中。

这是一个小的 Perl 命令,用于查找 makefile 中的目标

perl -ne 'if (/^([^.#][^:]+):/) {print "$1 "}'
        Makefile
If this is inserted in the entry, you can complete on targets from the file
called Makefile in the current working directory.
If someone should think I describe TCSH through it only in order
to promote TDG,(s)he should take a look at the following line, which is the
generated code for the make completion:
complete make  'p@*@`perl -ne \
        '"'"'>if (/^([^.#][^:]+):/) \
        {print "$1"}'"'"'Makefile`@'
限制为模式

使用用户定义的补全,您可以限制为每个命令匹配的文件。以下是两个非常有用的示例

  • 将 latex 限制为 *.{tex,dtx,ins} latex 命令将仅补全扩展名为 .tex.dtx.ins 的文件。

  • rm 限制为 ^*.{tex,html,c,h}.` 这意味着您不能将 rm 补全为 .tex.html.c.h 文件。我做过几次,当时我想删除一个名为 important.c~ 的文件。由于文件 important.c 存在,TCSH 只补全到该名称,然后...我删除了错误的文件,因为我太快了。

其他示例

可以通过加载随 TDG 分发的导出文件来获得其他示例。请注意,如果您希望保留其他页面,则必须告诉 TDG 仅导入页面 completion/userdefined。这在 Details 页面上完成,可以从 reload 页面访问。

配置提示符

使用 TDG 配置提示符非常容易。只需进入名为 prompt 的菜单。在此页面上,您可以配置三个提示符

  1. prompt:通常的提示符,您在命令行上看到的提示符,您将在其中输入命令

  2. prompt2:用于 foreachwhile 循环,以及以斜杠结尾的连续行

  3. prompt3:当 TCSH 尝试帮助您时使用,当它遇到它不知道的命令时——即,拼写检查

提示符与标记和普通文本混合在一起。标记通过单击滚动条下方的菜单中的标记来插入,普通文本只是键入即可。插入标记后,条目中将显示指示。图 4 是一个示例,说明这可能是什么样子。

图 4. 提示符和文本混合

某些提示符可以位于 xterm 标题栏中,而不是命令行上。要执行此操作,请选择 font change 并选择 Xterm

历史记录

shell 的历史记录机制使在彼此之后键入相似的命令更容易。要查看先前执行的命令列表,请键入 history

下表列出了 事件指定符

!n

这指的是索引为 n 的历史记录事件

!-n

这指的是 n 次前执行的历史记录事件:!-1 表示上一个命令,!-2 表示上上个命令,等等。

!!

这指的是上一个命令

!#

这指的是当前命令

!s

这指的是最近的命令,其第一个单词以字符串 s 开头

!?s?

这指的是最近的命令,其中包含字符串 s

使用这些事件指定符,您可以重新执行命令,例如,只需键入 !!,即可重新执行上一个命令。但是,这通常不是您想要做的。您真正想要做的是重新执行先前命令的某些部分,并添加一些新元素。为此,您可以使用以下 单词指示符 之一,该指示符附加到带有冒号的事件指定符。

0

第一个单词,即命令名称

n

n 个单词

$

最后一个参数

%

?s? 搜索匹配的单词

x-y

从 x 到 y 的参数范围

*

命令的所有参数(等于 ^-$)

现在可以通过键入 !!:$ 从上一个命令获取最后一个参数。您经常会看到您需要引用上一个命令,因此如果没有给出事件指定符,则使用上一个命令。这意味着,您只需键入 !$,而无需键入 !!:$

存在更多单词指示符,甚至可以使用不同的命令编辑单词。有关更多信息和示例,请查看在线 TCSH 手册,网址为 http://www.imada.ou.dk/Technical/Manpages/tcsh/History_substitution.html。

可以在评估历史记录引用之前,通过按 ESC-SPC 或 ESC-! 在命令行上展开它们。(即:首先按 escape 键,然后按空格键或 ! 键)。在某些键盘上,您可以使用 meta 键代替 ESC 键,即 M-SPC(一次击键)。

模式

shell 中的许多操作都作用于许多文件,例如,所有以 .tex 结尾或以 test- 开头的文件。TCSH 能够使用文件模式为您 键入 所有这些文件。以下列表显示了存在的可能性

*

*

?

?

[...]

[]

[x-y]

匹配 x 到 y 字符范围内的任何字符

[^...]

[^list]

{...}

这扩展到列出的所有单词。它们不需要匹配

^...

^ 在模式的开头否定该模式

示例
  • *.tex:匹配所有以 .tex 结尾的文件

  • ^*.tex:匹配所有不以 .tex 结尾的文件

  • xxx{ab,cde,hifj}yy:匹配 xxxabyy xxxcdeyy 和 xxxhifjyy

  • *.[ch] 或 *.{c,h}:匹配所有 .c 和 .h 文件

Shell 展开模式

需要注意的重要一点是,展开模式的是 shell,而不是 使用模式执行的程序。

这方面的一个例子是程序 mcopy,它从磁盘复制文件。要复制所有文件,您可能希望使用星号,如:mcopy a:* /tmp。但是,这不起作用,因为 shell 将尝试展开星号。由于它找不到任何以 a: 开头的文件,因此会发出错误信号。因此,如果您希望将星号发送到程序,则必须转义星号:mcopy a:\* .

有两个非常有用的键绑定可以与模式一起使用。第一个是 C-xg,它列出与模式匹配的所有文件,而不执行命令。另一个是 C-x*,它在命令行上展开星号。如果您希望删除除 important.cstable.canother.c 之外的所有以 .c 结尾的文件,这将特别有用。为此创建模式可能非常困难,因此只需使用模式 *.c。然后键入 C-x*,它会将 *.c 展开为您的所有 .c 文件。现在可以很容易地从列表中删除这三个文件。

别名

使用 shell 时,您很快就会意识到某些命令一遍又一遍地键入。最常用的命令之一肯定是 ls -la,它以长格式列出目录中的所有文件。

TCSH 具有为命令创建别名的机制。这意味着您可以为名为 lals -la 创建别名。

别名可以引用命令行的参数。这意味着您可以创建一个名为 pack 的命令,该命令接受目录名称并使用 tar 和 gz 打包该目录。

别名可能有点难以创建,因为您通常希望在使用时而不是在定义时展开历史记录/变量引用。使用 TDG 可以更轻松地完成此操作;转到页面 aliases 以定义别名。如果您最终得到一个您无法在此页面上定义的别名,但您可以在 TCSH 中定义,请给我发送电子邮件 (blackie@imada.ou.dk)。有关别名的更多信息,请参阅 TCSH 手册,网址为 http://www.imada.ou.dk/Technical/Manpages/tcsh/Alias_substitution.html。

程序计时

您是否曾经需要知道程序运行了多长时间,即它使用了多少 CPU?如果是这样,您可能会认出 TCSH 内置 time 命令的输出

0.020u 0.040s 0:00.11 54.5%     0+0k 0+0io 21pf+0w

信息丰富?是的,但是... GNU time 命令更容易理解

0.01user 0.08system 0:00.32elapsed 28%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+0minor)pagefaults 0swaps
在 TDG 中,您可以在名为 jobs 的页面上配置 time 命令的输出,如图 5 所示。

图 5. TDG 作业页面

参考文献

您可能已经猜到,TDG 和本文将对您使用 TCSH 有很大帮助,但您可能需要阅读更多内容才能从 TCSH 中获得更多收益。以下是一些参考文献

  • TCSH 手册页,网址为 http://www.imada.ou.dk/Technical/Manpages/tcsh/top.html

  • Using csh & tcsh,作者:Paul DuBois,由 O'Reilly & Associates 于 1995 年出版:http://www.primate.wisc.edu/software/csh-tcsh-book/

  • TCSH 邮件列表,地址为 tcsh@mx.gw.comr(要加入,请发送邮件至 listserv@mx.gw.com,正文文本为 SUBscribe TCSH 您的姓名

Jesper Pedersen 居住在丹麦的欧登塞,自 1990 年以来一直在欧登塞大学学习计算机科学。他是该大学的系统管理员,也教授计算机科学。他为他的“孩子”Dotfile Generator 感到非常自豪,这是他作为大学工作的一部分编写的。在他的业余时间,他练习柔术、听音乐、喝啤酒并与女友玩得开心。他喜欢宠物,有一个 200 升的水族箱和两只非常可爱的兔子。他的主页可以在 http://www.imada.ou.dk/~blackie/ 找到,可以通过 blackie@imada.ou.dk 联系到他。本文最初发表在 Linux Gazette 第 12 期。

加载 Disqus 评论