csh.1

TCSH(1)

TCSH(1)

FreeBSD General Commands Manual

TCSH(1)

tcsh - 具有文件补全和命令行编辑的 C shell

tcsh [-bcdefFimnqstvVxX**] [-Dname[=value]] [arg ...]**- tcsh -l

tcsh 是 Berkeley UNIX C shell, csh(1) 的增强但完全兼容的版本。 它是一种命令语言解释器,可用作交互式登录 shell 和 shell 脚本命令处理器。 它包括一个命令行编辑器(参见 命令行编辑器)、可编程单词完成(参见 完成和列表)、拼写纠正(参见 拼写纠正)、历史机制(参见 历史替换)、作业控制(参见 作业) 和类似 C 的语法。 新功能 部分描述了 tcsh 相对于 csh(1) 的主要增强。 在本手册中,大多数 csh(1) 实现(特别是 4.4BSD csh)中没有的 tcsh 功能都标有 `(+)', 而 csh(1) 中存在但通常没有记录的功能则标有 `(u)'。

如果 shell 的第一个参数(参数 0)是 `-' 那么它是一个登录 shell。 也可以通过使用 -l 标志作为唯一参数调用 shell 来指定登录 shell。

其余标志参数解释如下:

-b

强制从选项处理中“中断”,导致任何进一步的 shell 参数被视为非选项参数。 其余参数不会被解释为 shell 选项。 这可用于将选项传递给 shell 脚本,而不会造成混淆或可能的诡计。 如果没有此选项,shell 将不会运行设置用户 ID 脚本。

-c

命令从以下参数(必须存在,并且必须是单个参数)中读取,存储在 command shell 变量中以供参考,然后执行。 任何剩余的参数都放在 argv shell 变量中。

-d

shell 从 ~/.cshdirs 加载目录堆栈,如 启动和关闭 中所述,无论它是否是登录 shell。 (+)

-D_name_[=value]

将环境变量 name 设置为 value. (仅限 Domain/OS) (+)

-e

如果任何调用的命令异常终止或产生非零退出状态,则 shell 退出。

-f

shell 不加载任何资源或启动文件,也不执行任何命令散列,因此启动速度更快。

-F

shell 使用 fork(2) 而不是 vfork(2) 来生成进程。 (+)

-i

shell 是交互式的,并提示其顶级输入,即使它看起来不是终端。 如果 Shell 的输入和输出是终端,则 Shell 在没有此选项的情况下是交互式的。

-l

该 shell 是一个登录 shell 。仅当 -l 是指定的唯一标志时才适用。

-m

即使它不属于有效用户,shell 也会加载 ~/.tcshrc 。 较新版本的 su(1) 可以将 -m 传递给 shell。 (+)

-n

shell 解析命令但不执行它们。 这有助于调试 shell 脚本。

-q

shell 接受 SIGQUIT(请参阅 信号处理) 并在调试器下使用时表现。 作业控制被禁用。 (u)

-s

命令输入取自标准输入。

-t

shell 读取并执行单行输入。 A `\' 可用于在该行末尾转义换行符并继续到另一行。

-v

设置 verbose 变量,以便在历史替换后回显命令输入。

-x

设置 echo shell 变量,以便在执行前立即回显命令。

-V

甚至在执行 ~/.tcshrc 之前设置 verbose shell 变量。

-X

-x 一样,就像 -V-v 一样。

--help

在标准输出上打印帮助消息并退出。 (+)

--version

在标准输出上打印版本/平台/编译选项并退出。 此信息也包含在 version shell 变量中。 (+)

在处理标志参数之后,如果参数仍然存在,但没有给出 -c-i-s-t 选项,则第一个参数被视为命令文件的名称,或 ``script'',被执行。 shell 会打开这个文件并保存它的名字,以便可能用 `$0' 重新替换。 因为许多系统使用标准版本 6 或版本 7 shell,其 shell 脚本与此 shell 不兼容,所以 shell 使用这种 “标准” shell 来执行第一个字符不是 “#” 的脚本,即不要以评论开头。

剩余的参数放在 argv shell 变量中。

登录 shell 从执行系统文件 /etc/csh.cshrc/etc/csh.login 中的命令开始。 然后它从用户 home 目录中的文件执行命令:首先是 ~/.tcshrc (+) ,或者,如果找不到 ~/.tcshrc ,则 ~/.cshrc ,然后是 ~/.history 的内容(或 histfile shell 变量)被加载到内存中,然后是 ~/.login, 最后是 ~/.cshdirs (或 dirsfile shell 变量的值) (+)。 如果这样编译,shell 可能会在 /etc/csh.cshrc 之前而不是之后读取 /etc/csh.login ,并且在 ~/.tcshrc~/.cshrc~/.history 之前而不是之后读取 ~/.login ;查看 version 变量。 (+)

非登录 shell 在启动时只读 /etc/csh.cshrc~/.tcshrc~/.cshrc

启动文件示例请参考 http://tcshrc.sourceforge.net

stty(1) 和 tset(1) 这样的命令,每次登录只需要运行一次,通常放在一个人的 ~/.login 文件中。 需要在 csh(1) 和 tcsh 中使用同一组文件的用户只能拥有一个 ~/.cshrc ,它在使用 tcsh 特定命令之前检查 tcsh shell 变量 (qv) 的存在,或者两者都拥有一个 ~/.cshrc~/.tcshrc 哪个 source (参见内置命令) ~/.cshrc 。 本手册的其余部分使用 `~/.tcshrc 来表示 `~/.tcshrc ,或者,如果找不到 ~/.tcshrc ,则使用 ~/.cshrc'。

在正常情况下,shell 开始从终端读取命令,并以 `> ' 提示。 (参数的处理和使用 shell 处理包含命令脚本的文件将在后面描述。) shell 反复读取一行命令输入,将其分解为单词,将其放在命令历史列表中,对其进行解析并执行该行中的每个命令。

可以通过在空行输入 `^D'、`logout' 或 `login' 或通过 shell 的自动注销机制(参见 autologout shell 变量)来注销。 当登录 shell 终止时,它会根据需要将 logout shell 变量设置为 `normal' 或 `automatic' ,然后从文件 /etc/csh.logout~/.logout 执行命令。 如果这样编译,shell 可能会在注销时丢弃 DTR;查看 version shell 变量。

系统登录和注销文件的名称因系统而异,以便与不同的 csh(1) 变体兼容;见 文件

我们首先描述 命令行编辑器完成和列表 以及 拼写更正 部分描述了两组功能,它们作为编辑器命令实现,但值得单独处理。 最后, 编辑器命令 列出并描述了特定于 shell 的编辑器命令及其默认绑定。

可以使用与 emacs(1) 和 vi(1) 中使用的键序列非常相似的键序列来编辑命令行输入。 仅当设置了编辑 shell 变量时,编辑器才处于活动状态,默认情况下,它在交互式 shell 中处于活动状态。 内置的 bindkey 以显示和更改键绑定。 默认情况下使用 emacs(1) 样式的键绑定(除非另外编译了 shell;请参阅 version 变量),但 bindkey 可以将键绑定更改为 vi(1) 样式的绑定。

shell 总是将箭头键(在 TERMCAP 环境变量中定义)绑定到

down

down-history

up

up-history

left

backward-char

right

forward-char

除非这样做会改变另一个单字符绑定。 可以使用 settc 将箭头键转义序列设置为空字符串,以防止这些绑定。 箭头键的 ANSI/VT100 序列始终是绑定的。

其他键绑定在很大程度上是 emacs(1) 和 vi(1) 用户所期望的,并且可以通过 bindkey 轻松显示,因此无需在此列出。 同样, bindkey 可以列出编辑器命令以及每个命令的简短描述。 某些键绑定具有不同的行为,具体取决于使用的是 emacs(1) 还是 vi(1) 样式绑定;有关详细信息,请参阅 vimode

请注意,编辑器命令与 shell 的 “word” 概念不同。 编辑器用不在 shell 变量 wordchars 中的任何非字母数字字符分隔单词,而 shell 只识别空格和一些对其具有特殊含义的字符,列在 词法结构下。

当给定一个独特的缩写时,shell 通常能够完成单词。 键入单词的一部分(例如 `ls /usr/lost')并按 Tab 键以运行 complete-word 编辑器命令。 shell 将文件名 `/usr/lost' 补全为 `/usr/lost+found/',用输入缓冲区中的完整单词替换不完整的单词。 (注意终端“/”;完成在已完成目录的末尾添加一个“/”,在其他已完成单词的末尾添加一个空格,以加快输入速度并提供成功完成的视觉指示。 可以取消设置 addsuffix shell 变量来防止这种情况。) 如果没有找到匹配项(也许 `/usr/lost+found' 不存在),终端铃声响起。 如果单词已经完整(也许你的系统上有一个 `/usr/lost',或者你想得太远并且输入了整个内容)一个 `/' 或空格被添加到末尾,如果它不是' t 已经在那里了。

完成工作在生产线的任何地方,而不仅仅是在最后;完成的文本将行的其余部分向右推。 在单词中间补全通常会导致光标右侧的剩余字符需要删除。

命令和变量可以以几乎相同的方式完成。 例如,如果 emacs 是系统上唯一以 `em' 开头的命令,则键入 `em[tab]' 将完成 `em' 到 `emacs'。 完成可以在 path 中的任何目录中找到命令,或者如果给定完整的路径名。 如果没有其他变量以 `ar' 开头,键入 `echo $ar[tab]' 将完成 `$ar' 到 `$argv'。

shell 解析输入缓冲区以确定您要完成的单词是否应该作为文件名、命令或变量完成。 缓冲区中的第一个单词和 `;'、`|'、`|&'、`&&' 或 `||' 之后的第一个单词 被认为是一个命令。 以“$”开头的单词被认为是一个变量。 其他任何东西都是文件名。 空行作为文件名“完成”。

您可以随时通过键入 “^D” 来运行 delete-char-or-list-or-eof 编辑器命令来列出单词的可能完成。 shell 使用 ls-F 内置命令 (qv) 列出可能的完成,并重新打印提示符和未完成的命令行,例如:

> ls /usr/l[^D]- lbin/ lib/ local/ lost+found/- > ls /usr/l

如果设置了 autolist shell 变量,那么只要完成失败,shell 就会列出剩余的选项(如果有的话):

> set autolist- > nm /usr/lib/libt[tab]- libtermcap.a@ libtermlib.a@- > nm /usr/lib/libterm

如果 autolist 设置为 `ambiguous',则仅在完成失败时才会列出选项,并且不会向正在完成的单词添加新字符。

要完成的文件名可以包含变量、您自己或他人的主目录,缩写为 “~” (参见 文件名替换) 和目录堆栈条目,缩写为 “=” (参见 目录堆栈替换)。 例如,

> ls ~k[^D]- kahn kas kellogg- > ls ~ke[tab]- > ls ~kellogg/

> set local = /usr/local- > ls $lo[tab]- > ls $local/[^D]- bin/ etc/ lib/ man/ src/- > ls $local/

请注意,变量也可以使用 expand-variables 编辑器命令显式扩展。

delete-char-or-list-or-eof 仅在行尾列出;在一行的中间,它删除光标下的字符,并在空行上记录一个字符,或者,如果设置了 ignoreeof ,则什么也不做。 `M-^D',绑定到编辑器命令 list-choices, 列出一行中任何地方的完成可能性,以及 list-choices (或任何一个相关的编辑器命令,可以删除、列出和/或记录 out, 在 delete-char-or-list-or-eof 下列出) 如果需要,可以使用 bindkey 内置命令绑定到 `^D'。

complete-word-fwdcomplete-word-back 编辑器命令(默认情况下不绑定到任何键)可用于在可能的补全列表中上下循环,用下一个或上一个单词替换当前单词列表。

shell 变量 fignore 可以设置为完成时忽略的后缀列表。 考虑以下:

> ls- Makefile condiments.h~ main.o side.c- README main.c meal side.o- condiments.h main.c~- > set fignore = (.o \)- > emacs ma[^D]- main.c main.c main.o- > emacs ma[tab]- > emacs main.c

`main.c~' 和 `main.o' 被补全忽略(但不列出),因为它们以 fignore 的后缀结尾。 请注意,在 `~' 前面需要一个 `\' 以防止它被扩展为 home ,如 文件名替换 中所述。 如果只有一个完成是可能的,则忽略 fignore

如果 complete 变量设置为 `enhance',则完成 1) 忽略大小写和 2) 将句点、连字符和下划线(`.'、 `-' 和 `_')视为单词分隔符,并且连字符和下划线等效. 如果您有以下文件

comp.lang.c comp.lang.perl comp.std.c++- comp.lang.c++ comp.std.c

并输入 `mail -f c.l.c[tab]', 它会补全为 `mail -f comp.lang.c', 而 ^D 会列出 `comp.lang.c' 和 `comp.lang.c++'。 `mail -f c..c++[^D]' 将列出 `comp.lang.c++' 和 `comp.std.c++' 。在以下目录中键入 `rm a--file[^D]'

A_silly_file a-hyphenated-file another_silly_file

将列出所有三个文件,因为忽略大小写并且连字符和下划线是等效的。 但是,句点不等同于连字符或下划线。

如果 complete shell 变量设置为 `Enhance',则仅当用户键入小写字符或连字符时,完成才会忽略大小写以及连字符和下划线分隔符之间的差异。 输入大写字符或下划线将不匹配相应的小写字符或连字符分隔符。 在上一个示例的目录中输入 `rm a--file[^D]' 仍然会列出所有三个文件,但输入 `rm A--file' 将仅匹配 `A_silly_file' 并输入 `rm a__file[^D]' 将只匹配 `A_silly_file' 和 `another_silly_file' 因为用户明确使用了大写或下划线字符。

完成和列出受其他几个 shell 变量的影响: recexact 可以设置为在最短的唯一匹配上完成,即使更多的输入可能会导致更长的匹配:

> ls- fodder foo food foonly- > set recexact- > rm fo[tab]

只是哔哔声,因为 `fo' 可以扩展为 `fod' 或 `foo',但如果我们输入另一个 `o',

> rm foo[tab]- > rm foo

完成在 `foo' 上完成,即使 `food' 和 `foonly' 也匹配。 autoexpand 可以设置为在每次完成尝试之前运行 expand-history 编辑器命令, autocorrect 可以设置为在每次完成尝试之前对要完成的单词进行拼写更正(请参阅 拼写更正) ,而 correct 可以设置为在一个之后自动完成命令点击“返回”。 matchbeep 可以设置在各种情况下发出完成蜂鸣声或不发出蜂鸣声, nobeep 可以设置为从不发出蜂鸣声。 nostat 可以设置为与目录匹配的目录和/或模式的列表,以防止完成机制对这些目录进行 stat(2) 处理。 listmaxlistmaxrows 可以设置为限制在不先询问的情况下列出的项目和行的数量(分别)。可以设置 recognize_only_executables 使 shell 在列出命令时只列出可执行文件,但是速度很慢。

最后, complete 的内置命令可用于告诉 shell 如何完成文件名、命令和变量以外的单词。 补全和列出不适用于 glob-patterns(请参阅 文件名替换) ,但 list-globexpand-glob 编辑器命令对 glob-patterns 执行等效功能。

shell 有时可以更正文件名、命令和变量名的拼写,以及完成和列出它们。

可以使用 spell-word 编辑器命令(通常绑定到 Ms 和 MS)和使用 spell-line (通常绑定到 M-$)对整个输入缓冲区进行拼写更正。 correct shell 变量可以设置为 `cmd' 以更正命令名称或 `all' 以在每次键入 return 时更正整行,并且可以设置 autocorrect 以在每次完成尝试之前更正要完成的单词。

当以任何这些方式调用拼写更正并且 shell 认为命令行的任何部分拼写错误时,它会使用更正的行进行提示:

> set correct = cmd- > lz /usr/bin- CORRECT>ls /usr/bin (y|n|e|a)?

可以回答 “y” 或空格来执行更正的行,“e” 可以将未更正的命令留在输入缓冲区中,“a” 可以中止命令,就好像 “^C” 被击中一样,以及其他任何东西来执行原线不变。

拼写更正可识别用户定义的补全(请参阅 complete 内置命令)。 如果定义补全位置的输入单词与补全列表中的单词相似,则拼写更正会记录拼写错误并建议后一个单词作为更正。 但是,如果输入单词与该位置的任何可能完成不匹配,则拼写更正不会记录拼写错误。

与补全一样,拼写更正可以在行中的任何位置进行,将行的其余部分向右推,并可能在光标右侧留下额外的字符。

`bindkey' 列出键绑定和 `bindkey -l' 列表并简要描述编辑器命令。 这里只描述新的或特别有趣的编辑器命令。 有关每个编辑器的键绑定的描述,请参见 emacs(1) 和 vi(1) 。

每个命令默认绑定的一个或多个字符在括号中给出。 `^character' 表示控制字符,而 `M-character 表示元字符,在没有元键的终端上键入为转义 character 。 大小写计数,但默认情况下绑定到字母的命令为方便起见绑定到小写和大写字母。

backward-char (^B, left)

向后移动一个字符。 vimode 修改的光标行为。

backward-delete-word (M-^H, M-^?)

从当前单词的开头剪切到光标 - 保存在剪切缓冲区中。 vimode 修改的字边界行为。

backward-word (M-b, M-B)

移动到当前单词的开头。 vimode 修改的字边界和光标行为。

beginning-of-line (^A, home)

移动到行首。 vimode 修改的光标行为。

capitalize-word (M-c, M-C)

大写从光标到当前单词结尾的字符。 vimode 修改的字边界行为。

complete-word (tab)

按照 完成和列表 中的描述完成一个单词。

complete-word-back (not bound)

complete-word-fwd 类似,但从列表末尾开始。

complete-word-fwd (not bound)

用可能完成列表中的第一个单词替换当前单词。 可能会重复通过列表逐步降级。 在列表末尾,发出哔哔声并恢复为不完整的单词。

complete-word-raw (^X-tab)

complete-word 类似,但忽略用户定义的补全。

copy-prev-word (M-^_)

将当前行中的前一个单词复制到输入缓冲区中。 另见 insert-last-wordvimode 修改的字边界行为。

dabbrev-expand (M-/)

将当前单词扩展为当前是前导子字符串的最近的前一个单词,必要时环绕历史列表(一次)。 重复 dabbrev-expand 而没有对下一个前一个单词等进行任何干预的键入更改,跳过相同的匹配项,就像 history-search-backward 所做的那样。

delete-char (not bound)

删除光标下的字符。另请参阅 delete-char-or-list-or-eofvimode 修改的光标行为。

delete-char-or-eof (not bound)

如果光标下有字符或空行上有 end-of-file ,则执行 delete-char 。 另请参阅 delete-char-or-list-or-eofvimode 修改的光标行为。

delete-char-or-list (not bound)

如果光标下有一个字符,或者行尾有 list-choices ,则执行 delete-char 。 另请参阅 delete-char-or-list-or-eof

delete-char-or-list-or-eof (^D)

如果光标下有一个字符,则执行 delete-char ,行尾的 list-choices 或在空行的 end-of-file 。 另请参见这三个命令,每个命令只执行一个操作,以及 delete-char-or-eofdelete-char-or-listlist-or-eof, 每个命令执行三个中不同的两个。

delete-word (M-d, M-D)

从光标剪切到当前单词的结尾 - 保存在剪切缓冲区中。vimode 修改的字边界行为。

down-history (down-arrow, ^N)

up-history, 但步下,停在原来的输入行。

downcase-word (M-l, M-L)

小写从光标到当前单词结尾的字符。 vimode 修改的字边界行为。

end-of-file (not bound)

发出文件结束信号,导致 shell 退出,除非设置了 ignoreeof shell 变量 (qv) 来防止这种情况。 另请参阅 delete-char-or-list-or-eof

end-of-line (^E, end)

将光标移动到行尾。 vimode 修改的光标行为。

expand-history (M-space)

扩展当前单词中的历史替换。请参阅 历史替换 。 另请参见 magic-spacetoggle-literal-historyautoexpand shell 变量。

expand-glob (^X-*)

将全局模式扩展到光标左侧。请参阅 文件名替换

expand-line (not bound)

expand-history 类似,但扩展了输入缓冲区中每个单词的历史替换。

expand-variables (^X-$)

将变量展开到光标左侧。 请参阅 变量替换

forward-char (^F, right)

向前移动一个字符。 vimode 修改的光标行为。

forward-word (M-f, M-F)

前进到当前单词的结尾。 vimode 修改的字边界和光标行为。

history-search-backward (M-p, M-P)

在历史列表中向后搜索从输入缓冲区的当前内容开始直到光标的命令,并将其复制到输入缓冲区中。 搜索字符串可以是包含 “*”、“?”、“[]” 或 “{}” 的全局模式(参见 文件名替换) 。 up-historydown-history 将从历史列表中的适当点开始。 仅限 Emacs 模式。 另请参阅 历史向前搜索 and i-search-back

history-search-forward (M-n, M-N)

history-search-backward 类似,但向前搜索。

i-search-back (not bound)

history-search-backward 一样向后搜索,将第一个匹配复制到输入缓冲区中,光标位于模式的末尾,并使用 `bck:' 和第一个匹配进行提示。 可以键入其他字符来扩展搜索,可以键入 i-search-back 以继续使用相同的模式进行搜索,必要时环绕历史列表, (i-search-back 必须绑定到单个字符才能工作)或可以键入以下特殊字符之一:

^W

将光标下单词的其余部分附加到搜索模式。

删除(或任何绑定到 backward-delete-char)

撤消最后输入的字符的效果,并在适当的情况下从搜索模式中删除一个字符。

^G

如果先前的搜索成功,则中止整个搜索。 如果没有,则返回上一次成功的搜索。

escape

结束搜索,将当前行留在输入缓冲区中。

任何其他未绑定到 self-insert-command 的字符都会终止搜索,将当前行留在输入缓冲区中,然后被解释为正常输入。 特别是,回车会导致当前行被执行。 另请参阅 i-search-fwdhistory-search-backwardvimode 修改的字边界行为。

i-search-fwd (not bound)

i-search-back 类似,但向前搜索。 vimode 修改的字边界行为。

insert-last-word (M-_)

将前一个输入行的最后一个单词 (`!$') 插入输入缓冲区。 另请参阅 copy-prev-word

list-choices (M-^D)

列出 Completion and listing 下所述的完成可能性。 另请参阅 delete-char-or-list-or-eoflist-choices-raw

list-choices-raw (^X-^D)

list-choices 类似,但忽略用户定义的补全。

list-glob (^X-g, ^X-G)

列表(通过 ls-F 内置) 与光标左侧的全局模式(请参阅 文件名替换) 匹配。

list-or-eof (not bound)

在空行上执行 list-choicesend-of-file 。 另请参阅 delete-char-or-list-or-eof

magic-space (not bound)

扩展当前行中的历史替换,如 expand-history ,并插入一个空格。 magic-space 设计为与空格键绑定,但默认不绑定。

normalize-command (^X-?)

在 PATH 中搜索当前单词,如果找到,则将其替换为可执行文件的完整路径。 特殊字符被引用。 别名被扩展和引用,但别名中的命令不是。 该命令对于将命令作为参数的命令很有用,例如 `dbx' 和 `sh -x'。

normalize-path (^X-n, ^X-N)

按照 symlinks shell 变量的 `expand' 设置中的描述扩展当前单词。

overwrite-mode (unbound)

在输入和覆盖模式之间切换。

run-fg-editor (M-^Z)

保存当前输入行并在 editors shell 变量中找到第一个单词的文件名部分的已停止作业。 如果没有设置 editors ,那么将使用 EDITOR 环境变量的文件名部分(如果未设置,则为 “ed”)和 VISUAL 环境变量(如果未设置,则为 “vi”)。 如果找到这样的作业,它会重新启动,就好像输入了 `fg %job' 一样。 这用于轻松地在编辑器和外壳之间来回切换。 有些人将此命令绑定到 `^Z',以便他们可以更轻松地执行此操作。

run-help (M-h, M-H)

搜索有关当前命令的文档,使用与完成例程相同的“当前命令”概念,并打印它。 没有办法使用寻呼机; run-help 专为简短的帮助文件而设计。 如果定义了特殊别名 helpcommand ,它将以命令名作为唯一参数运行。 否则,文档应位于名为 command.help、 command.1、 command.6、 command.8 或 command 的文件中,该文件应位于 HPATH 环境变量中列出的目录之一中。 如果有多个帮助文件,则只打印第一个。

self-insert-command (text characters)

在插入模式(默认)下,将键入的字符插入到光标下字符之后的输入行中。 在覆盖模式下,用键入的字符替换光标下的字符。 输入模式通常保留在行之间,但 inputmode shell 变量可以设置为 “insert” 或 “overwrite” 以将编辑器置于每行开头的该模式。 另请参见 覆盖模式

sequence-lead-in (arrow prefix, meta prefix, ^X)

表示以下字符是多键序列的一部分。 将一个命令绑定到一个多键序列实际上会创建两个绑定:第一个字符到 sequence-lead-in 和整个序列到命令。 所有以绑定到 sequence-lead-in 的字符开头的序列都有效地绑定到 undefined-key ,除非绑定到另一个命令。

spell-line (M-$)

尝试更正输入缓冲区中每个单词的拼写,例如 spell-word ,但忽略第一个字符是 “-”、“!”、“^” 或 “%” 或包含 “\” 的单词, `*' 或 `?',以避免开关、替换等问题。 请参阅 拼写更正

spell-word (M-s, M-S)

尝试按照 拼写更正 中的说明更正当前单词的拼写。 检查似乎是路径名的单词的每个组成部分。

toggle-literal-history (M-r, M-R)

扩展或“取消扩展”输入缓冲区中的历史替换。 另请参阅 expand-historyautoexpand 变量。

undefined-key (any unbound key)

哔哔声。

up-history (up-arrow, ^P)

将历史列表中的前一个条目复制到输入缓冲区中。 如果设置了 histlit ,则使用条目的文字形式。 可能会重复通过历史列表逐步向上,在顶部停止。

upcase-word (M-u, M-U)

从光标到当前单词结尾的字符大写。 vimode 修改的字边界行为。

vi-beginning-of-next-word (not bound)

转到下一个单词的开头。 vimode 修改的字边界和光标行为。

vi-eword (not bound)

Vi 移动到当前单词的末尾。 vimode 修改的字边界行为。

vi-search-back (?)

用“?”提示 对于搜索字符串(可能是全局模式,与 history-search-backward 一样),搜索它并将其复制到输入缓冲区中。 如果没有找到匹配项,铃声就会响起。 点击 return 结束搜索并将最后一个匹配项留在输入缓冲区中。 点击转义结束搜索并执行匹配。 仅限 vi 模式。

vi-search-fwd (/)

类似于 vi-search-back ,但向前搜索。

which-command (M-?)

对输入缓冲区的第一个字执行 which 参见内置命令的描述)。

yank-pop (M-y)

yank 或另一个 yank-pop 之后立即执行时,将 yank 字符串替换为 killring 中的下一个前一个字符串。 这也有旋转 killring 的效果,这样这个字符串将被认为是最近被后面的 yank 命令杀死的。 重复 yank-pop 将在 killring 中循环任意次数。

shell 将输入行拆分为空格和制表符处的单词。 特殊字符 `&'、`|'、`;'、`<'、`>'、`(' 和 `)' 和双字符 `&&'、`||'、`<<' 和 ` >>' 始终是单独的单词,无论它们是否被空格包围。

当 shell 的输入不是终端时,使用字符 `#' 开始注释。 每个 `#' 和它出现的输入行的其余部分在进一步解析之前被丢弃。

特殊字符(包括空格或制表符)可能会被阻止具有其特殊含义,并且可能会成为另一个单词的一部分,方法是在它前面加上反斜杠(`\')或将其括在单('''),双 (`"' ) 或后向 (``') 引号。 如果没有以其他方式引用,则以 `\' 开头的换行符等效于空白,但在引号内,此序列会产生换行符。

此外,除了 History substitution 之外的 Substitutions (见下文)都可以通过用单引号括住它们出现的字符串(或字符串的一部分)或通过引用关键字符(例如,`$' 或 ``' 分别用于 Variable substitutionCommand substitution )与 `\'。 (Alias substitution 也不例外:以任何方式引用已定义 alias 的单词的任何字符都可以防止替换别名。 引用别名的常用方法是在其前面加上反斜杠。)反斜杠可以防止 History substitution ,但单引号不能。 用双引号或反引号引用的字符串会进行 Variable substitutionCommand substitution ,但会阻止其他替换。

单引号或双引号内的文本变成一个单词(或一个单词的一部分)。 这些字符串中的元字符(包括空格和制表符)不会形成单独的单词。 只有在一种特殊情况下(参见下面的 Command substitution ),双引号字符串可以产生多个单词的部分;单引号字符串永远不会。 后向引号很特殊:它们表示 Command substitution (qv),这可能导致多个单词。

引用复杂的字符串,尤其是本身包含引用字符的字符串,可能会造成混淆。 请记住,不必像在人类写作中那样使用引号!可能更容易引用不是整个字符串,而是仅引用字符串中需要引用的那些部分,如果合适的话,使用不同类型的引用来这样做。

可以设置 backslash_quote shell 变量 (qv) 以使反斜杠始终引用 `\'、 `'' 和 `"' 。 (+) 这可能会使复杂的引用任务变得更容易,但它可能会导致 csh(1) 脚本中的语法错误。

我们现在描述 shell 按照它们发生的顺序对输入执行的各种转换。 我们在传递所涉及的数据结构以及影响它们的命令和变量时会注意到。 请记住,可以通过在 词法结构

从终端输入的每个命令或“事件”都保存在历史列表中。 前面的命令总是被保存, history shell 变量可以设置为一个数字来保存那么多的命令。 histdup shell 变量可以设置为不保存重复事件或连续重复事件。

保存的命令从 1 开始按顺序编号,并带有时间标记。 通常不需要使用事件编号,但当前事件编号可以通过放置 “!” 作为提示的一部分。在 prompt shell 变量中。

shell 实际上以扩展和文字(未扩展)的形式保存历史。 如果设置了 histlit shell 变量,则显示和存储历史记录的命令使用文字形式。

history 内置命令可以随时打印、存储在文件中、恢复和清除历史列表,并且可以设置 savehisthistfile shell 变量在注销时自动存储历史列表并在登录时恢复。

历史替换将历史列表中的单词引入到输入流中,从而可以轻松地重复命令、在当前命令中重复上一个命令的参数或修复上一个命令中的拼写错误,而且输入很少且置信度很高。

历史替换以字符“!”开头。它们可以从输入流中的任何位置开始,但它们不会嵌套。 这个特殊的缩写将在后面描述。 可以通过设置 histchars shell 变量来更改用于表示历史替换的字符(`!' 和 `^')。 任何包含历史替换的输入行在执行之前都会被打印出来。

历史替换可能有一个 “event specification”,它指示要从中提取词的事件,一个 “word designator”,它从选定的事件中选择特定的词,和/或一个 “modifier” ,它操纵选定的单词。

事件规范可以是

n

一个数字,指的是一个特定的事件

-n

一个偏移量,指的是当前事件之前的事件 n

当前事件。 这应该在不检查递归的 csh(1) 中谨慎使用。 tcsh 允许 10 级递归。 (+)

!

上一个事件(相当于 `-1')

s

第一个单词以字符串 s 开头的最近事件

?s?

包含字符串 s 的最新事件。 第二个“?” 如果后面紧跟换行符,则可以省略。

例如,考虑一下某人的历史列表:

9 8:30 nroff -man wumpus.man- 10 8:31 cp wumpus.man wumpus.man.old- 11 8:36 vi wumpus.man- 12 8:37 diff wumpus.man.old wumpus.man

这些命令连同它们的事件编号和时间戳一起显示。 我们尚未输入的当前事件是事件 13。 `!!' 指上一个事件,12。 `!!' 可以缩写为 `!' 如果它后面跟着 `:' (`:' 将在下面描述)。 `!n' 指的是事件 9,它以 `n' 开头。 `!?old?' 也指事件 12,其中包含 `old' 。 如果没有单词指示符或修饰符,历史引用只会扩展到整个事件,因此我们可以输入 `!cp' 来重做复制命令,或者如果 `diff' 输出滚动到屏幕顶部,我们可能会输入 `!!|more' 。

历史参考可以在必要时用大括号与周围的文本隔离开来。例如, `!vdoc' 会查找以 `vdoc' 开头的命令,并且在本例中找不到,但 `!{v}doc' 会明确地扩展为 `vi wumpus.mandoc'。 即使在大括号中,历史替换也不会嵌套。

(+) 例如,当 csh(1) 将 `!3d' 扩展为事件 3 并附加了字母 `d' 时, tcsh 将其扩展为以 `3d' 开头的最后一个事件;只有完全数字的参数被视为事件编号。 这使得调用以数字开头的事件成为可能。 要在 csh(1) 中扩展 `!3d' ,请说 `!{3}d'。

要从事件中选择单词,我们可以按照事件规范使用 `:' 和所需单词的指示符。 输入行的单词从 0 开始编号,第一个(通常是命令)单词为 0,第二个单词(第一个参数)为 1,以此类推。 基本的词指示符是:

0

第一个(命令)词

n

n 个参数

^

第一个参数,相当于 `1'

$

最后的论据

%

用 ?s? 搜索匹配的词

x-y

一系列单词

-y

相当于 `0-y'

*

相当于 `^-$' ,但如果事件仅包含 1 个单词,则不返回任何内容

x*

相当于 `x-$'

x-

相当于 `x*' ,但省略了最后一个单词 (`$')

选定的单词被插入到由单个空格分隔的命令行中。 例如,前面例子中的 `diff' 命令可能被输入为 `diff !!:1.old !!:1' (使用 `:1' 选择前一个事件的第一个参数)或 `diff !-2:2 !-2:1' 从 `cp' 命令中选择和交换参数。 如果我们不关心 `diff' 的顺序,我们可能会说 `diff !-2:1-2' 或简单地说 `diff !-2:*'。 `cp' 命令可能写成 `cp wumpus.man !#:1.old', 使用 `#' 表示当前事件。 `!n:- hurkle.man' 将重用来自 `nroff' 命令的前两个单词来表示 `nroff -man hurkle.man'。

如果参数选择器以 `^', `$', `*', `%' 或 `-' 开头,则可以省略分隔事件规范和单词指示符的 `:' 。 例如,我们的 `diff' 命令可能是 `diff !!^.old !!^' 或等价的 `diff !!$.old !!$' 。 但是,如果 `!!' 缩写为 `!', 以 `-' 开头的参数选择器将被解释为事件规范。

历史参考可能有一个词指示符,但没有事件规范。 然后它引用前面的命令。 继续我们的 `diff' 示例,我们可以简单地说 `diff !^.old !^' 或者,以相反的顺序获得参数,只是 `diff !*'。

历史引用中的一个或多个单词可以被编辑或 ``modified'',方法是在它后面加上一个或多个修饰符,每个修饰符前面都有一个 `:':

h

删除尾随路径名组件,留下头部。

t

删除所有前导路径名组件,留下尾部。

r

删除文件扩展名 `.xxx',保留根名称。

e

删除除扩展名之外的所有内容。

u

大写第一个小写字母。

l

小写第一个大写字母。

s_/l/r/_

l 代替 rl 只是一个类似于 r 字符串,而不是同名的 ed(1) 命令中的正则表达式。 任何字符都可以用作分隔符来代替 `/'; a `\' 可用于引用 lr 中的分隔符。 r 中的字符`&' 被 l 替换; `\' 也引用了 `&'。 如果 l 为空 (``''), 则使用来自先前替换的 l 或来自先前搜索的 s 或事件规范中的事件编号。 如果后面紧跟换行符,则可以省略尾随分隔符。

&

重复前面的替换。

g

对每个单词应用一次以下修饰符。

a (+)

将以下修饰符尽可能多地应用于单个单词。 `a' 和 `g' 可以一起使用以全局应用修饰符。 使用 `s' 修饰符,仅替换原始单词中包含的模式,而不是包含任何替换结果的模式。

p

打印新的命令行但不执行它。

q

引用替换的单词,防止进一步替换。

x

与 q 类似,但在空格、制表符和换行符处分成单词。

修饰符仅适用于第一个可修改的单词(除非使用了 `g' )。 没有单词可以修改是错误的。

例如, `diff' 命令可能写成 `diff wumpus.man.old !#^:r', 使用 `:r' 从同一行的第一个参数中删除 `.old' (`!#^') 。 我们可以说 `echo hello out there', 然后说 `echo !*:u' 来大写 `hello', `echo !*:au' 来大声说出来,或者 `echo !*:agu' 来大喊大叫。 我们可以在 `mail -s "I forgot my password" rot' 后面加上 `!:s/rot/root' 来更正 `root' 的拼写(但请参阅 拼写更正 了解不同的方法)。

替换有一个特殊的缩写。 `^' ,当它是输入行的第一个字符时,等价于 `!:s^'。 因此,我们可能会说 `^rot^root' 来进行前面示例中的拼写更正。 这是唯一没有明确以 `!' 开头的历史替换。

(+) 在这样的 csh 中,只能将一个修饰符应用于每个历史记录或变量扩展。 在 tcsh 中,可以使用多个,例如

% mv wumpus.man /usr/man/man1/wumpus.1- % man !$:t:r- man wumpus

csh 中,结果将是 `wumpus.1:r'。 后跟冒号的替换可能需要用大括号与之隔离:

> mv a.out /usr/games/wumpus- > setenv PATH !$:h:$PATH- Bad ! modifier: $.- > setenv PATH !{-2$:h}:$PATH- setenv PATH /usr/games:/bin:/usr/bin:.

第一次尝试在 csh 中会成功,但在 tcsh 中会失败,因为 tcsh 在第二个冒号之后需要另一个修饰符,而不是 `$'。

最后,可以通过编辑器以及刚刚描述的替换访问历史记录。 up-down-historyhistory-search-backward-forwardi-search-back-fwdvi-search-back-fwdcopy-prev-wordinsert-last-word 编辑器命令搜索历史列表中的事件并将它们复制到输入缓冲区中。 toggle-literal-history 编辑器命令在输入缓冲区中历史行的展开形式和文字形式之间切换。 expand-historyexpand-line 分别在当前单词和整个输入缓冲区中展开历史替换。

维护一个别名列表,可以通过 aliasunalias 命令设置、取消设置和打印这些别名。 在将命令行解析为简单命令(请参阅 命令) 后,检查每个命令的第一个单词,从左到右,看它是否有别名。 如果是这样,则将第一个单词替换为别名。 如果别名包含历史引用,它将经历 History substitution (qv),就好像原始命令是前一个输入行一样。 如果别名不包含历史引用,则参数列表保持不变。

因此,如果 `ls' 的别名是 `ls -l' ,那么命令 `ls /usr' 就会变成 `ls -l /usr', 这里的参数列表不会受到干扰。 如果 `lookup' 的别名是 `grep !^ /etc/passwd' 那么 `lookup bill' 将变成 `grep bill /etc/passwd'。 别名可用于引入解析器元语法。 例如, `alias print 'pr \!* | lpr'' 定义了一个 ``command'' (`print') ,它 pr(1) 将它的参数传递给行式打印机。

重复别名替换,直到命令的第一个单词没有别名。 如果别名替换没有更改第一个单词(如前面的示例中),则将其标记为防止循环。 检测到其他循环并导致错误。

shell 引用了一些别名;请参阅 特殊别名

shell 维护一个变量列表,每个变量都有一个包含零个或多个单词的列表作为值。 可以使用 setunset 命令显示和更改 shell 变量的值。 系统维护自己的 ``environment'' 变量列表。 这些可以使用 printenvsetenvunsetenv 显示和更改。

(+) 可以使用 `set -r'(qv) 将变量设为只读。 只读变量不得修改或取消设置;尝试这样做会导致错误。 一旦设置为只读,就不能将变量设置为可写,因此应谨慎使用 `set -r' 。 环境变量不能设为只读。

一些变量由 shell 设置或由它引用。例如, argv 变量是 shell 参数列表的图像,并且该变量值的单词以特殊方式引用。 shell 引用的一些变量是切换;shell 不关心它们的值是什么,只关心它们是否被设置。 例如, verbose 变量是一个切换,它导致命令输入被回显。 -v 命令行选项设置此变量。 Special shell variables 列出了 shell 引用的所有变量。

其他操作以数值方式处理变量。 `@' 命令允许执行数字计算并将结果分配给变量。 但是,变量值始终表示为(零个或多个)字符串。 出于数值运算的目的,空字符串被认为是零,并且忽略多字值的第二个和后续字。

在输入行被别名和解析之后,并且在每个命令被执行之前,变量替换由 `$' 字符键入。 这种扩展可以通过在 `$' 前面加上 `\' 来防止,除非在 `"'s 中它 总是 出现,而在 `'' 中它 从不 出现。 ``' 引用的字符串稍后会被解释(见下面的 命令替换 ),所以 `$' 替换直到稍后才会发生,如果有的话。 如果后面跟着空格、制表符或换行符,则 `$' 会被原封不动地传递。

输入/输出重定向在变量扩展之前被识别,并且是单独的变量扩展。 否则,命令名称和整个参数列表将一起展开。 因此,第一个(命令)词(至此)可能生成多个词,其中第一个词成为命令名称,其余词成为参数。

除非包含在 `"' 中或给定 `:q' 修饰符,否则变量替换的结果最终可能会被命令和文件名替换。 在 `"' 中,其值由多个单词组成的变量扩展为单个单词(一部分),变量值的单词由空格分隔。 当`:q' 修饰符应用于替换时,变量将扩展为多个单词,每个单词由空格分隔并引用以防止以后的命令或文件名替换。

提供以下元序列用于将变量值引入 shell 输入。 除非另有说明,否则引用未设置的变量是错误的。

$name

${name}

替换变量 name 花括号将 name 与下列字符隔离开来,否则这些字符将成为名称的一部分。Shell 变量的名称由以字母开头的字母和数字组成。 下划线字符被认为是一个字母。 如果 name 不是 shell 变量,而是在环境中设置,则返回该值(但下面给出的其他一些形式在这种情况下不可用)。

$name[selector]

${name[selector]}

仅替换 name 值中的选定单词。 selector 会被 `$' 替换,并且可以由一个数字或两个数字组成,由一个 `-' 分隔。 变量值的第一个单词编号为 `1'。 如果省略范围的第一个数字,则默认为 `1'。 如果省略范围的最后一个成员,则默认为 `$#name'。 selector `*' 选择所有单词。 如果第二个参数被省略或在范围内,则范围为空不是错误。

$0

替换正在从中读取命令输入的文件的名称。 如果名称未知,则会发生错误。

$number

${number}

相当于 `$argv[number]'。

$*

相当于 `$argv',相当于 `$argv[*]'。

History substitution 中描述的 `:' 修饰符,除了 `:p', 可以应用于上面的替换。 可以使用不止一个。 (+) 可能需要大括号来将变量替换与文字冒号隔离开来,就像 History substitution (qv) 一样;任何修饰符都必须出现在大括号内。

以下替换不能使用 `:' 修饰符进行修改。

$?name

${?name}

如果设置了 name ,则替换字符串 `1' ,如果没有设置,则替换为 `0' 。

$?0

如果当前输入文件名已知,则替换为 `1' ,如果不知道,则替换为 `0' 。 在交互式 shell 中始终为 `0' 。

$#name

${#name}

替换 name 中的单词数。

$#

相当于 `$#argv'。 (+)

$%name

${%name}

替换 name 中的字符数。 (+)

$%number

${%number}

替换 $argv[number] 中的字符数。 (+)

$?

相当于 `$status'。 (+)

最后更新于

FreeBSD 中文社区