> For the complete documentation index, see [llms.txt](https://man.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://man.bsdcn.org/man1/csh.1.md).

# csh(1)

`tcsh` — 具有文件名补全和命令行编辑功能的 C shell

## 名称

`tcsh`

## 概要

`tcsh [-bcdefFimnqstvVxX] [-Dname[=value]] [arg ...]`

`tcsh -l`

## 描述

`tcsh` 是 Berkeley UNIX C shell `csh(1)` 的增强版本，完全向后兼容。它是一个命令语言解释器，既可作为交互式登录 shell 使用，也可作为 shell 脚本命令处理器使用。它包含命令行编辑器（参见“命令行编辑器”）、可编程的字补全（参见“补全与列表”）、拼写校正（参见“拼写校正”）、历史机制（参见“历史替换”）、作业控制（参见“作业”）以及类 C 语法。“新特性”一节描述了 `tcsh` 相对于 `csh(1)` 的主要增强功能。本手册中，`tcsh` 中绝大多数 `csh(1)` 实现所没有的特性（具体指 4.4BSD `csh`）以“(+）”标记，而 `csh(1)` 中存在但通常未文档化的特性则以“(u）”标记。

### 参数列表处理

如果 shell 的第一个参数（参数 0）是 `-`，则为登录 shell。也可以通过以 `-l` 标志作为唯一参数调用 shell 来指定登录 shell。

其余标志参数解释如下：

`-b` 强制“中断”选项处理，使后续所有 shell 参数被视作非选项参数。剩余参数将不会被解释为 shell 选项。这可用于将选项传递给 shell 脚本而不产生混淆或潜在欺骗。若未指定此选项，shell 不会运行 set-user ID 脚本。

`-c` 从下一个参数（必须存在且必须是单个参数）读取命令，存入 `command` shell 变量供引用，并执行。其余参数放入 `argv` shell 变量。

`-d` shell 从 **\~/.cshdirs** 加载目录栈，如“启动与关闭”所述，无论是否为登录 shell。（+）

`-Dname[=value]` 将环境变量 `name` 设为 `value`。（仅 Domain/OS）（+）

`-e` 若任何被调用命令异常终止或返回非零退出状态，shell 退出。

`-f` shell 不加载任何资源或启动文件，也不执行命令哈希，从而启动更快。

`-F` shell 使用 `fork(2)` 而非 `vfork(2)` 来派生进程。（+）

`-i` shell 交互式运行并提示顶层输入，即使其输入输出似乎不是终端。若不带此选项且输入输出为终端，shell 也是交互式的。

`-l` shell 为登录 shell。仅在 `-l` 为唯一指定的标志时适用。

`-m` shell 加载 **\~/.tcshrc**，即使它不属于有效用户。新版 `su(1)` 可向 shell 传递 `-m`。（+）

`-n` shell 解析命令但不执行。这有助于调试 shell 脚本。

`-q` shell 接受 SIGQUIT（参见“信号处理”），并在调试器下使用时表现正常。作业控制被禁用。（u）

`-s` 命令输入取自标准输入。

`-t` shell 读取并执行单行输入。可使用 `\` 转义该行末尾的换行符并继续到下一行。

`-v` 设置 `verbose` shell 变量，使命令输入在历史替换后回显。

`-x` 设置 `echo` shell 变量，使命令在执行前立即回显。

`-V` 在执行 **\~/.tcshrc** 之前即设置 `verbose` shell 变量。

`-X` 对 `-x` 的作用同 `-V` 对 `-v` 的作用。

`--help` 在标准输出打印帮助信息并退出。（+）

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

处理完标志参数后，若仍有参数剩余但未指定 `-c`、`-i`、`-s` 或 `-t` 选项，则第一个参数被视作要执行的命令文件名（“脚本”）。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 变量。（+）

非登录 shell 启动时仅读取 **/etc/csh.cshrc** 和 **\~/.tcshrc** 或 **\~/.cshrc**。

关于启动文件的示例，请参阅 <http://tcshrc.sourceforge.net>。

`stty(1)` 和 `tset(1)` 等每次登录只需运行一次的命令通常放在 **\~/.login** 文件中。需要在 `csh(1)` 和 `tcsh` 之间共用同一组文件的用户，可以只保留一个 **\~/.cshrc**，在使用 `tcsh` 特定命令前检查 `tcsh` shell 变量是否存在；也可以同时保留 **\~/.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 在注销时可能 dropping DTR；参见 `version` shell 变量。

系统登录和注销文件的名称因系统而异，以兼容不同的 `csh(1)` 变体；参见“文件”。

### 编辑

我们首先描述“命令行编辑器”。“补全与列表”和“拼写校正”两节描述了两组实现为编辑器命令但值得单独讨论的功能。最后，“编辑器命令”列出并描述了 shell 特有的编辑器命令及其默认绑定。

### 命令行编辑器（+）

命令行输入可使用类似 `emacs(1)` 或 `vi(1)` 的按键序列进行编辑。仅当 `edit` shell 变量被设置时编辑器才激活，交互式 shell 中默认设置。`bindkey` 内建命令可显示和更改按键绑定。默认使用 `emacs(1)` 风格按键绑定（除非编译时另行配置；参见 `version` shell 变量），但 `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 不同。编辑器使用任何不在 `wordchars` shell 变量中的非字母数字字符作为单词分隔符，而 shell 仅识别空白及其自身具有特殊含义的某些字符（参见“词法结构”）。

### 补全与列表（+）

shell 通常能在给定唯一缩写时补全单词。键入单词的一部分（例如 `ls /usr/lost`）并按 Tab 键运行 `complete-word` 编辑器命令。shell 将文件名 `/usr/lost` 补全为 `/usr/lost+found/`，用完整单词替换输入缓冲区中的不完整单词。（注意末尾的 `/`；补全在补全的目录末尾添加 `/`，在其他补全的单词末尾添加空格，以加快输入速度并提供补全成功的视觉指示。可取消设置 `addsuffix` shell 变量来阻止此行为。）如果未找到匹配项（可能 `/usr/lost+found` 不存在），终端响铃。如果单词已完整（可能你的系统上有 `/usr/lost`，或你想得太远把整个单词都打出来了），则在末尾添加 `/` 或空格（如果尚未存在）。

补全可在行中任意位置进行，而不仅在末尾；补全的文本将行的其余部分向右推。在单词中间补全通常会在光标右侧留下需要删除的多余字符。

命令和变量可以以类似方式补全。例如，键入 `em[tab]` 会将 `em` 补全为 `emacs`（如果 `emacs` 是你系统中唯一以 `em` 开头的命令）。补全可在 `path` 的任何目录中或给定完整路径名时找到命令。键入 `echo $ar[tab]` 会将 `$ar` 补全为 `$argv`（如果没有其他变量以 `ar` 开头）。

shell 解析输入缓冲区以确定你要补全的单词应作为文件名、命令还是变量补全。缓冲区中的第一个单词以及 `;`、`|`、`|&`、`&&` 或 `||` 后的第一个单词被视为命令。以 `$` 开头的单词被视为变量。其他情况视为文件名。空行被“补全”为文件名。

可随时键入 `^D` 运行 `delete-char-or-list-or-eof` 编辑器命令来列出单词可能的补全。shell 使用 `ls-F` 内建命令（参见下文）列出可能的补全，并重新打印提示符和未完成的命令行，例如：

```
> 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`（或其他相关列出/删除/注销或不执行这些操作的编辑器命令，参见 `delete-char-or-list-or-eof`）可通过 `bindkey` 内建命令绑定到 `^D`。

`complete-word-fwd` 和 `complete-word-back` 编辑器命令（默认未绑定任何键）可用于在可能补全列表中上下循环，用列表中的下一个或上一个单词替换当前单词。

`fignore` shell 变量可设为补全时应忽略的后缀列表。考虑以下示例：

```
> 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` shell 变量设为 `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)` 操作。`listmax` 和 `listmaxrows` 可分别设为限制首次询问前列出的项目数和行数。`recognize_only_executables` 可设为使命令列表中仅列出可执行文件，但相当慢。

最后，`complete` 内建命令可告知 shell 如何补全文件名、命令和变量以外的单词。补全和列表不对 glob 模式起作用（参见“文件名替换”），但 `list-glob` 和 `expand-glob` 编辑器命令对 glob 模式执行等效功能。

### 拼写校正（+）

shell 有时能在补全和列表之外校正文件名、命令和变量名的拼写。

可通过 `spell-word` 编辑器命令（通常绑定到 M-s 和 M-S）对单个单词进行拼写校正，通过 `spell-line`（通常绑定到 M-$）对整个输入缓冲区进行校正。`correct` shell 变量可设为 `cmd` 以在每次按回车时校正命令名，或 `all` 校正整行；`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` 表示元字符（在没有元键的终端上以 escape-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` `(未绑定)` 类似 `complete-word-fwd`，但从列表末尾向上步进。

`complete-word-fwd` `(未绑定)` 用可能补全列表中的第一个单词替换当前单词。可重复以向下步进列表。在列表末尾响铃并恢复为不完整单词。

`complete-word-raw` `(^X-tab)` 类似 `complete-word`，但忽略用户定义的补全。

`copy-prev-word` `(M-^_)` 将当前行中前一个单词复制到输入缓冲区。另见 `insert-last-word`。单词边界行为受 `vimode` 修改。

`dabbrev-expand` `(M-/)` 将当前单词展开为最近的、以当前单词为前导子串的前一个单词，必要时（仅一次）环绕历史列表。无任何中间输入地重复 `dabbrev-expand` 会切换到下一个前一个单词等，跳过相同匹配，类似于 `history-search-backward`。

`delete-char` `(未绑定)` 删除光标下的字符。另见 `delete-char-or-list-or-eof`。光标行为受 `vimode` 修改。

`delete-char-or-eof` `(未绑定)` 若光标下有字符则执行 `delete-char`，空行则执行 `end-of-file`。另见 `delete-char-or-list-or-eof`。光标行为受 `vimode` 修改。

`delete-char-or-list` `(未绑定)` 若光标下有字符则执行 `delete-char`，行尾则执行 `list-choices`。另见 `delete-char-or-list-or-eof`。

`delete-char-or-list-or-eof` `(^D)` 若光标下有字符则执行 `delete-char`，行尾则执行 `list-choices`，空行则执行 `end-of-file`。另见这三个各只执行单一动作的命令，以及 `delete-char-or-eof`、`delete-char-or-list` 和 `list-or-eof`（各执行三者中的两种）。

`delete-word` `(M-d, M-D)` 从光标剪切到当前单词末尾，保存到剪切缓冲区。单词边界行为受 `vimode` 修改。

`down-history` `(下方向键, ^N)` 类似 `up-history`，但向下步进，停在原始输入行。

`downcase-word` `(M-l, M-L)` 将光标到当前单词末尾的字符转为小写。单词边界行为受 `vimode` 修改。

`end-of-file` `(未绑定)` 发出文件结束信号，除非设置了 `ignoreeof` shell 变量以阻止，否则导致 shell 退出。另见 `delete-char-or-list-or-eof`。

`end-of-line` `(^E, end)` 移动光标到行尾。光标行为受 `vimode` 修改。

`expand-history` `(M-space)` 展开当前单词中的历史替换。参见“历史替换”。另见 `magic-space`、`toggle-literal-history` 和 `autoexpand` shell 变量。

`expand-glob` `(^X-*)` 展开光标左侧的 glob 模式。参见“文件名替换”。

`expand-line` `(未绑定)` 类似 `expand-history`，但展开输入缓冲区中每个单词中的历史替换。

`expand-variables` `(^X-$)` 展开光标左侧的变量。参见“变量替换”。

`forward-char` `(^F, right)` 向前移动一个字符。光标行为受 `vimode` 修改。

`forward-word` `(M-f, M-F)` 向前移动到当前单词末尾。单词边界和光标行为受 `vimode` 修改。

`history-search-backward` `(M-p, M-P)` 向后搜索历史列表中以输入缓冲区到光标处内容开头的命令，并将其复制到输入缓冲区。搜索串可以是包含 `*`、`?`、`[]` 或 `{}` 的 glob 模式（参见“文件名替换”）。`up-history` 和 `down-history` 会从历史列表的相应位置继续。仅限 emacs 模式。另见 `history-search-forward` 和 `i-search-back`。

`history-search-forward` `(M-n, M-N)` 类似 `history-search-backward`，但向前搜索。

`i-search-back` `(未绑定)` 向后搜索，类似 `history-search-backward`，将第一个匹配复制到输入缓冲区，光标位于模式末尾，并以 `bck:` 和第一个匹配提示。可键入更多字符扩展搜索，可键入 `i-search-back` 继续以相同模式搜索（必要时环绕历史列表；`i-search-back` 必须绑定到单字符才能工作），或键入以下特殊字符之一：

* `^W`：将光标下单词的其余部分追加到搜索模式。
* delete（或任何绑定到 `backward-delete-char` 的字符）：撤销最后键入字符的效果，并在适当时从搜索模式中删除一个字符。
* `^G`：若上次搜索成功，中止整个搜索；否则回到上次成功搜索。
* escape：结束搜索，将当前行留在输入缓冲区。

任何其他未绑定到 `self-insert-command` 的字符都会终止搜索，将当前行留在输入缓冲区，然后被解释为正常输入。特别是，回车会导致当前行被执行。另见 `i-search-fwd` 和 `history-search-backward`。单词边界行为受 `vimode` 修改。

`i-search-fwd` `(未绑定)` 类似 `i-search-back`，但向前搜索。单词边界行为受 `vimode` 修改。

`insert-last-word` `(M-_)` 将前一输入行的最后一个单词（`!$`）插入到输入缓冲区。另见 `copy-prev-word`。

`list-choices` `(M-^D)` 如“补全与列表”所述列出补全可能性。另见 `delete-char-or-list-or-eof` 和 `list-choices-raw`。

`list-choices-raw` `(^X-^D)` 类似 `list-choices`，但忽略用户定义的补全。

`list-glob` `(^X-g, ^X-G)` 列出（通过 `ls-F` 内建命令）光标左侧 glob 模式（参见“文件名替换”）的匹配。

`list-or-eof` `(未绑定)` 执行 `list-choices` 或在空行上执行 `end-of-file`。另见 `delete-char-or-list-or-eof`。

`magic-space` `(未绑定)` 展开当前行中的历史替换（类似 `expand-history`）并插入空格。`magic-space` 设计为绑定到空格键，但默认未绑定。

`normalize-command` `(^X-?)` 在 PATH 中搜索当前单词，若找到则用可执行文件的完整路径替换。特殊字符被引用。别名被展开并引用，但别名内的命令不展开。此命令对于接受命令作为参数的命令很有用，例如 `dbx` 和 `sh -x`。

`normalize-path` `(^X-n, ^X-N)` 按 `symlinks` shell 变量的 `expand` 设置展开当前单词。

`overwrite-mode` `(未绑定)` 在输入和覆盖模式之间切换。

`run-fg-editor` `(M-^Z)` 保存当前输入行，查找一个停止的作业，其第一个单词的文件名部分在 `editors` shell 变量中找到。若未设置 `editors`，则使用 `EDITOR` 环境变量（未设置则为 `ed`）和 `VISUAL` 环境变量（未设置则为 `vi`）的文件名部分。若找到此类作业，则如同键入 `fg %job` 一样重启它。这用于在编辑器和 shell 之间轻松切换。一些人将此命令绑定到 `^Z` 以便更轻松地操作。

`run-help` `(M-h, M-H)` 使用与补全例程相同的“当前命令”概念搜索当前命令的文档并打印。无法使用分页器；`run-help` 设计用于简短的帮助文件。若定义了 `helpcommand` 特殊别名，则以命令名作为唯一参数运行。否则，文档应位于名为 `command.help`、`command.1`、`command.6`、`command.8` 或 `command` 的文件中，这些文件应在 `HPATH` 环境变量列出的目录之一中。若有多个帮助文件，仅打印第一个。

`self-insert-command` `(文本字符)` 在插入模式（默认）下，将键入的字符插入到光标下字符之后。在覆盖模式下，用键入的字符替换光标下的字符。输入模式通常在行间保留，但 `inputmode` shell 变量可设为 `insert` 或 `overwrite` 以在每行开始时将编辑器置于该模式。另见 `overwrite-mode`。

`sequence-lead-in` `(方向键前缀, 元前缀, ^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-history` 和 `autoexpand` shell 变量。

`undefined-key` `(任何未绑定的键)` 响铃。

`up-history` `(上方向键, ^P)` 将历史列表中的上一条目复制到输入缓冲区。若设置了 `histlit`，使用条目的字面形式。可重复以向上步进历史列表，停在顶部。

`upcase-word` `(M-u, M-U)` 将光标到当前单词末尾的字符转为大写。单词边界行为受 `vimode` 修改。

`vi-beginning-of-next-word` `(未绑定)` vi 跳到下一个单词开头。单词边界和光标行为受 `vimode` 修改。

`vi-eword` `(未绑定)` vi 移动到当前单词末尾。单词边界行为受 `vimode` 修改。

`vi-search-back` `(?)` 以 `?` 提示搜索串（可为 glob 模式，如 `history-search-backward`），搜索并将其复制到输入缓冲区。若无匹配则响铃。按回车结束搜索并将最后匹配留在输入缓冲区。按 escape 结束搜索并执行匹配。仅限 vi 模式。

`vi-search-fwd` `(/)` 类似 `vi-search-back`，但向前搜索。

`which-command` `(M-?)` 对输入缓冲区的第一个单词执行 `which`（参见内建命令描述）。

`yank-pop` `(M-y)` 当在 `yank` 或另一个 `yank-pop` 之后立即执行时，用 killring 中的下一个前一个字符串替换被 yank 的字符串。这也会旋转 killring，使此字符串被后续 `yank` 命令视为最近被杀死的。重复 `yank-pop` 会循环 killring 任意次数。

### 词法结构

shell 在空白和制表符处将输入行拆分为单词。特殊字符 `&`、`|`、`;`、`<`、`>`、`(` 和 `)` 以及双写字符 `&&`、`||`、`<<` 和 `>>` 始终是独立的单词，无论其周围是否有空白。

当 shell 的输入不是终端时，字符 `#` 被视为注释的开始。每个 `#` 及其所在输入行的其余部分在进一步解析前被丢弃。

特殊字符（包括空白或制表符）可通过在其前加反斜杠（`\`）或用单引号（`'`）、双引号（`"`）或反引号（`` ` ``）括起来，防止其具有特殊含义，并可能使其成为另一个单词的一部分。未另行引用时，前加 `\` 的换行符等价于空白，但在引号内此序列产生换行。

此外，除“历史替换”外的所有“替换”（见下文）都可通过用单引号括起字符串（或字符串部分）或引用关键字符（例如 `$` 或 `` ` `` 分别用于“变量替换”或“命令替换”）用 `\` 来阻止。（“别名替换”也不例外：以任何方式引用已定义 `alias` 的单词的任何字符都会阻止别名替换。引用别名的常用方法是在其前加反斜杠。）“历史替换”可被反斜杠阻止，但不能被单引号阻止。用双引号或反引号括起的字符串会进行“变量替换”和“命令替换”，但其他替换被阻止。

单引号或双引号内的文本成为单个单词（或单词的一部分）。这些字符串中的元字符（包括空白和制表符）不形成独立单词。仅在一种特殊情况（参见下文“命令替换”）下，双引号字符串可能产生多个单词；单引号字符串永远不会。反引号是特殊的：它们标记“命令替换”，可能产生多个单词。

引用复杂字符串，尤其是本身包含引用字符的字符串，可能令人困惑。记住，引号不必像人类书写那样使用！有时仅引用字符串中需要引用的部分，而非整个字符串，使用不同类型的引用来做到这一点，可能更容易。

`backslash_quote` shell 变量可设为使反斜杠始终引用 `\`、`'` 和 `"`。（+）这可使复杂引用任务更容易，但可能在 `csh(1)` 脚本中导致语法错误。

### 替换

现在按发生顺序描述 shell 对输入执行的各种转换。我们顺便提及所涉及的数据结构以及影响它们的命令和变量。记住，替换可通过引用来阻止，如“词法结构”所述。

### 历史替换

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

保存的命令从 1 开始顺序编号并加盖时间戳。通常无需使用事件编号，但可通过在 `prompt` shell 变量中放置 `!` 使当前事件编号成为提示符的一部分。

默认情况下，历史条目通过打印每个解析的 token（以空格分隔）来显示；因此重定向操作符 `>&!` 将显示为 `> & !`。

shell 实际上以展开和字面（未展开）两种形式保存历史。若设置了 `histlit` shell 变量，显示和存储历史的命令使用字面形式。

`history` 内建命令可随时打印、存储到文件、恢复和清除历史列表，`savehist` 和 `histfile` shell 变量可设为在注销时自动存储历史列表并在登录时恢复。

历史替换将历史列表中的单词引入输入流，使得重复命令、在前一条命令的当前命令中重复其参数，或以少量输入和高置信度修正前一条命令中的拼写错误变得容易。

历史替换以字符 `!` 开始。它们可在输入流中任何位置开始，但不嵌套。`!` 前可加 `\` 以阻止其特殊含义；为方便起见，`!` 后跟空白、制表符、换行、`=` 或 `(` 时原样传递。当输入行以 `^` 开头时也会发生历史替换。此特殊缩写将在后文描述。标记历史替换的字符（`!` 和 `^`）可通过设置 `histchars` shell 变量来更改。任何包含历史替换的输入行在执行前都会被打印。

历史替换可有“事件说明”（指示从哪个事件取词）、“单词选择器”（从所选事件中选择特定单词）和/或“修饰符”（操作所选单词）。

事件说明可以是：

* `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。`!11` 和 `!-2` 引用事件 11。`!!` 引用前一事件 12。`!!` 后跟 `:`（`:` 在下文描述）时可缩写为 `!`。`!n` 引用事件 9（以 `n` 开头）。`!?old?` 也引用事件 12（包含 `old`）。没有单词选择器或修饰符时，历史引用简单地展开为整个事件，因此我们可以键入 `!cp` 重做复制命令，或 `!!|more`（如果 `diff` 输出滚出屏幕顶部）。

如有必要，历史引用可用花括号与周围文本隔离。例如，`!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 !*`。

历史引用中的单词可通过后跟一个或多个修饰符（每个前加 `:`）来编辑或“修改”：

* `h`：删除尾部路径名组件，保留头部。
* `t`：删除所有前导路径名组件，保留尾部。
* `r`：删除文件名扩展 `.xxx`，保留根名。
* `e`：删除除扩展名外的所有内容。
* `u`：将第一个小写字母大写。
* `l`：将第一个大写字母小写。
* `s/l/r/`：用 `r` 替换 `l`。`l` 只是像 `r` 那样的字符串，不像同名 `ed(1)` 命令中的正则表达式。任何字符都可用作分隔符代替 `/`；可用 `\` 引用 `l` 和 `r` 内的分隔符。`r` 中的 `&` 被替换为 `l`；`\` 也可引用 `&`。若 `l` 为空（""），则使用前一次替换的 `l` 或事件说明中前一次搜索或事件编号的 `s`。若尾部分隔符紧跟换行符则可省略。
* `&`：重复前一次替换。
* `g`：将以下修饰符对每个单词应用一次。
* `a`（+）：将以下修饰符对单个单词尽可能多次应用。`a` 和 `g` 可一起使用以全局应用修饰符。对于 `s` 修饰符，仅替换原始单词中包含的模式，不替换包含任何替换结果的模式。
* `p`：打印新命令行但不执行。
* `q`：引用被替换的单词，阻止进一步替换。
* `Q`：同 `q`，但额外将空变量保留为包含 NUL 的字符串。这对于保留位置参数很有用，例如：

  ```
  > set args=('arg 1' '' 'arg 3')
  > tcsh -f -c 'echo ${#argv}' $args:gQ
  3
  ```
* `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-history`、`history-search-backward` 和 `-forward`、`i-search-back` 和 `-fwd`、`vi-search-back` 和 `-fwd`、`copy-prev-word` 和 `insert-last-word` 编辑器命令搜索历史列表中的事件并将其复制到输入缓冲区。`toggle-literal-history` 编辑器命令在输入缓冲区中历史行的展开和字面形式之间切换。`expand-history` 和 `expand-line` 分别展开当前单词和整个输入缓冲区中的历史替换。

### 别名替换

shell 维护一个别名列表，可通过 `alias` 和 `unalias` 命令设置、取消和打印。命令行被解析为简单命令（参见“命令”）后，每个命令的第一个单词从左到右检查是否有别名。若有，则第一个单词被别名替换。若别名包含历史引用，则对其进行“历史替换”，如同原始命令是前一输入行。若别名不包含历史引用，则参数列表保持不变。

因此若 `ls` 的别名是 `ls -l`，则命令 `ls /usr` 变为 `ls -l /usr`，此处的参数列表未受干扰。若 `lookup` 的别名是 `grep !^ /etc/passwd`，则 `lookup bill` 变为 `grep bill /etc/passwd`。别名可用于引入解析器元语法。例如，`alias print 'pr \!* | lpr'` 定义了一个“命令”（`print`），将其参数 `pr(1)` 到行式打印机。

别名替换重复进行，直到命令的第一个单词没有别名。若别名替换未改变第一个单词（如上例），则被标记以防止循环。其他循环被检测到并导致错误。

某些别名被 shell 引用；参见“特殊别名”。

### 变量替换

shell 维护一个变量列表，每个变量的值是零个或多个单词的列表。shell 变量的值可通过 `set` 和 `unset` 命令显示和更改。系统维护自己的“环境”变量列表。这些可通过 `printenv`、`setenv` 和 `unsetenv` 显示和更改。

(+) 变量可通过 `set -r`（参见下文）设为只读。只读变量不能被修改或取消；尝试这样做会导致错误。一旦设为只读，变量就不能再设为可写，因此 `set -r` 应谨慎使用。环境变量不能设为只读。

某些变量由 shell 设置或引用。例如，`argv` 变量是 shell 参数列表的镜像，其值中的单词以特殊方式引用。shell 引用的某些变量是开关；shell 不关心其值，只关心是否设置。例如，`verbose` 变量是导致命令输入回显的开关。`-v` 命令行选项设置此变量。“特殊 shell 变量”列出了所有被 shell 引用的变量。

其他操作以数字方式处理变量。`@` 命令允许执行数值计算并将结果赋给变量。但变量值始终表示为（零个或多个）字符串。对于数值操作，空字符串被视为零，多单词值的第二个及后续单词被忽略。

输入行经过别名替换和解析后，每条命令执行前，以 `$` 字符为键执行变量替换。此展开可通过在 `$` 前加 `\` 来阻止，但在 `"` 中始终发生，在 `'` 中从不发生。反引号括起的字符串稍后解释（参见下文“命令替换”），因此 `$` 替换在那里不立即发生。`$` 后跟空白、制表符或行尾时原样传递。

输入/输出重定向在变量展开前被识别，并单独进行变量展开。否则，命令名和整个参数列表一起展开。因此，（到此为止的）第一个（命令）单词可能产生多个单词，第一个成为命令名，其余成为参数。

除非用 `"` 括起或给定 `:q` 修饰符，否则变量替换的结果最终可能被命令和文件名替换。在 `"` 中，值由多个单词组成的变量展开为（部分）单个单词，变量值的单词以空格分隔。当 `:q` 修饰符应用于替换时，变量展开为多个单词，每个单词以空格分隔并引用以阻止后续命令或文件名替换。

以下元序列用于将变量值引入 shell 输入。除注明外，引用未设置的变量是错误的。

`$name`、`${name}`：替换变量 `name` 的值中的单词，每个以空格分隔。花括号将 `name` 与后续字符隔离，否则这些字符会成为 `name` 的一部分。shell 变量名由字母和数字组成，以字母开头。下划线字符被视为字母。若 `name` 不是 shell 变量但在环境中设置，则返回该值（但下面给出的某些其他形式在此情况下不可用）。

`$name[selector]`、`${name[selector]}`：仅替换 `name` 值中选定的单词。`selector` 经受 `$` 替换，可由单个数字或两个以 `-` 分隔的数字组成。变量值的第一个单词编号为 `1`。若范围的第一个数字省略，默认为 `1`。若范围的最后一个成员省略，默认为 `$#name`。`selector` `*` 选择所有单词。若第二个参数省略或在范围内，范围为空不算错误。

`$0`：替换正在读取命令输入的文件名。若名称未知则出错。

`$number`、`${number}`：等价于 `$argv[number]`。

`$*`：等价于 `$argv`，即等价于 `$argv[*]`。

“历史替换”中描述的 `:` 修饰符（除 `:p` 外）可应用于上述替换。可使用多个。（+）可能需要花括号将变量替换与字面冒号隔离，如“历史替换”所述；任何修饰符必须出现在花括号内。

以下替换不能用 `:` 修饰符修改。

`$?name`、`${?name}`：若 `name` 已设置则替换字符串 `1`，否则为 `0`。

`$?0`：若当前输入文件名已知则替换 `1`，否则为 `0`。交互式 shell 中始终为 `0`。

`$#name`、`${#name}`：替换 `name` 中的单词数。

`$#`：等价于 `$#argv`。（+）

`$%name`、`${%name}`：替换 `name` 中的字符数。（+）

`$%number`、`${%number}`：替换 `$argv[number]` 中的字符数。（+）

`$?`：等价于 `$status`。（+）

`$$`：替换（父）shell 的（十进制）进程号。

`$!`：替换此 shell 启动的最后一个后台进程的（十进制）进程号。（+）

`$_`：替换最后执行的命令的命令行。（+）

`$<`：从标准输入替换一行，之后无进一步解释。可用于在 shell 脚本中从键盘读取。（+）`csh` 始终引用 `$<`（等价于 `$<:q`），而 `tcsh` 不如此。此外，当 `tcsh` 等待键入一行时，用户可键入中断以中断要将该行替换到的序列，但 `csh` 不允许此操作。

`expand-variables` 编辑器命令（通常绑定到 `^X-$`）可用于交互式地展开单个变量。

### 命令、文件名和目录栈替换

其余替换有选择地应用于内建命令的参数。这意味着表达式中未求值的部分不会经受这些展开。对于非 shell 内部的命令，命令名与参数列表分开替换。这发生得很晚，在输入/输出重定向之后，在主 shell 的子进程中。

### 命令替换

命令替换由反引号括起的命令指示。此类命令的输出在空白、制表符和换行处拆分为单独的单词，空单词被丢弃。输出经过变量和命令替换，并放在原始字符串的位置。

双引号（`"`）内的命令替换保留空白和制表符；仅换行强制产生新单词。任何情况下，单个最终换行不强制产生新单词。因此，即使命令输出完整一行，命令替换也可能仅产生单词的一部分。

默认情况下，自版本 6.12 起，shell 将命令中的所有换行和回车字符替换为空格。若通过取消设置 `csubstnonl` 关闭此行为，换行如常分隔命令。

### 文件名替换

若单词包含 `*`、`?`、`[` 或 `{` 中任一字符，或以 `~` 开头，则它是文件名替换（又称“globbing”）的候选。该单词被视为模式（“glob 模式”），并替换为按字母顺序排序的匹配文件名列表。

匹配文件名时，文件名开头或紧跟 `/` 后的 `.` 字符以及 `/` 字符必须显式匹配（除非设置了 `globdot` 或 `globstar` 或两者都设置（+））。`*` 匹配任意字符串，包括空串。`?` 匹配任意单个字符。序列 `[...]` 匹配括号内任一字符。在 `[...]` 内，以 `-` 分隔的字符对匹配两者之间词典序的任意字符。

(+) 某些 glob 模式可取反：序列 `[^...]` 匹配括号内字符和/或字符范围未指定的任意单个字符。

整个 glob 模式也可用 `^` 取反：

```
> echo *
bang crash crunch ouch
> echo ^cr*
bang ouch
```

不使用 `?`、`*` 或 `[]` 或使用 `{}` 或 `~`（见下文）的 glob 模式不能正确取反。

元表示法 `a{b,c,d}e` 是 `abe ace ade` 的简写。从左到右的顺序被保留：`/usr/source/s1/{oldls,ls}.c` 展开为 `/usr/source/s1/oldls.c /usr/source/s1/ls.c`。匹配结果在低层单独排序以保留此顺序：`../{memo,*box}` 可能展开为 `../memo ../box ../mbox`。（注意 `memo` 未与 `*box` 的匹配结果一起排序。）当此构造展开到不存在的文件时不算错误，但向展开列表传递给的命令可能出错。此构造可嵌套。作为特殊情况，单词 `{`、`}` 和 `{}` 原样传递。

文件名开头的 `~` 字符引用主目录。单独使用（即 `~`）时，展开为调用者的主目录（反映在 `home` shell 变量的值中）。后跟由字母、数字和 `-` 字符组成的名称时，shell 搜索具有该名称的用户并替换其主目录；因此 `~ken` 可能展开为 `/usr/ken`，`~ken/chmach` 展开为 `/usr/ken/chmach`。若 `~` 后跟非字母或 `/` 的字符，或不出现在单词开头，则原样保留。像 `setenv MANPATH /usr/man:/usr/local/man:~/lib/man` 这样的命令不会如人所愿地执行主目录替换。

包含 `*`、`?`、`[` 或 `~`（带或不带 `^`）的 glob 模式不匹配任何文件时出错。但 glob 模式列表中只有一个模式必须匹配文件（因此例如 `rm *.a *.c *.o` 仅当当前目录中没有以 `.a`、`.c` 或 `.o` 结尾的文件时才失败），且若设置了 `nonomatch` shell 变量，不匹配任何内容的模式（或模式列表）保持不变而非出错。

`globstar` shell 变量可设为允许 `**` 或 `***` 作为文件 glob 模式，匹配包含 `/` 的任意字符串，递归遍历任何现有子目录。例如，`ls **.c` 会列出当前目录树中所有 .c 文件。单独使用时，匹配零个或多个子目录（例如 `ls /usr/include/**/time.h` 会列出 /usr/include 目录树中任何名为 `time.h` 的文件；`ls /usr/include/**time.h` 会匹配 /usr/include 目录树中以 `time.h` 结尾的任何文件；`ls /usr/include/**time**.h` 会匹配子目录名或文件名本身中含 `time` 的任何 .h 文件）。为防止递归问题，`**` glob 模式不会下钻到包含目录的符号链接。要覆盖此行为，使用 `***`（+）。

`noglob` shell 变量可设为阻止文件名替换，`expand-glob` 编辑器命令（通常绑定到 `^X-*`）可用于交互式地展开单个文件名替换。

### 目录栈替换（+）

目录栈是一个目录列表，从零开始编号，由 `pushd`、`popd` 和 `dirs` 内建命令（参见下文）使用。`dirs` 可随时打印、存储到文件、恢复和清除目录栈，`savedirs` 和 `dirsfile` shell 变量可设为在注销时自动存储目录栈并在登录时恢复。`dirstack` shell 变量可被检查以查看目录栈，也可被设置以将任意目录放入目录栈。

字符 `=` 后跟一个或多个数字展开为目录栈中的条目。特殊情况 `=-` 展开为栈中最后一个目录。例如：

```
> dirs -v
0       /usr/bin
1       /usr/spool/uucp
2       /usr/accts/sys
> echo =1
/usr/spool/uucp
> echo =0/calendar
/usr/bin/calendar
> echo =-
/usr/accts/sys
```

`noglob` 和 `nonomatch` shell 变量以及 `expand-glob` 编辑器命令同时适用于目录栈替换和文件名替换。

### 其他替换（+）

还有几种涉及文件名但不严格属于上述内容的转换，此处为完整性提及。当 `symlinks` 变量（参见下文）设为 `expand` 时，任何文件名都可展开为完整路径。引用阻止此展开，`normalize-path` 编辑器命令按需执行。`normalize-command` 编辑器命令按需将 PATH 中的命令展开为完整路径。最后，`cd` 和 `pushd` 将 `-` 解释为旧工作目录（等价于 `owd` shell 变量）。这根本不是替换，而是仅由这些命令识别的缩写。但同样，它也可通过引用阻止。

### 命令

下三节描述 shell 如何执行命令及其输入输出。

### 简单命令、管道和序列

简单命令是一系列单词，第一个指定要执行的命令。以 `|` 字符连接的一系列简单命令形成管道。管道中每个命令的输出连接到下一个的输入。

简单命令和管道可用 `;` 连接成序列，并按顺序执行。命令和管道也可用 `||` 或 `&&` 连接成序列，如同 C 语言，分别表示仅当第一个失败或成功时才执行第二个。

简单命令、管道或序列可放在括号 `()` 中形成简单命令，后者又可作为管道或序列的组件。命令、管道或序列后跟 `&` 可在不等待其终止的情况下执行。

### 内建与非内建命令执行

内建命令在 shell 内部执行。若管道中除最后一个外的任何组件是内建命令，则管道在子 shell 中执行。

括号中的命令始终在子 shell 中执行。

```
(cd; pwd); pwd
```

因此打印 `home` 目录，让你留在原处（在 home 目录之后打印），而：

```
cd; pwd
```

让你留在 `home` 目录。括号中的命令最常用于防止 `cd` 影响当前 shell。

当要执行的命令不是内建命令时，shell 尝试通过 `execve(2)` 执行。`path` 变量中的每个单词命名一个目录，shell 将在其中查找命令。若 shell 未给定 `-f` 选项，shell 将这些目录中的名称哈希到内部表中，以便仅在可能存在该命令的目录中尝试 `execve(2)`。当搜索路径中存在大量目录时，这大大加快了命令定位。此哈希机制不用于：

1. 通过 `unhash` 显式关闭哈希时。
2. shell 被给定 `-f` 参数时。
3. 对于 `path` 中不以 `/` 开头的每个目录组件。
4. 命令包含 `/` 时。

在上述四种情况下，shell 将路径向量的每个组件与给定命令名拼接，形成文件路径名，然后尝试执行。若执行成功，搜索停止。

若文件有执行权限但系统无法执行（即既不是可执行二进制文件也不是指定解释器的脚本），则假定它是包含 shell 命令的文件，并生成新 shell 读取它。`shell` 特殊别名可设为指定 shell 本身以外的解释器。

在不理解 `#!` 脚本解释器约定的系统上，shell 可编译为模拟它；参见 `version` shell 变量。若如此，shell 检查文件第一行是否为 `#!interpreter arg ...` 形式。若是，shell 以给定 `arg` 启动 `interpreter` 并将文件作为标准输入提供给它。

### 输入/输出

命令的标准输入和标准输出可用以下语法重定向：

`< name`：打开文件 `name`（首先进行变量、命令和文件名展开）作为标准输入。

`<< word`：读取 shell 输入直到与 `word` 完全相同的行。`word` 不经受变量、文件名或命令替换，每行输入在与 `word` 比较前不进行任何替换。除非 `word` 中出现引用的 `\`、`"`、`'` 或 `` ` ``，否则对中间行进行变量和命令替换，允许 `\` 引用 `$`、`\` 和 `` ` ``。被替换的命令保留所有空白、制表符和换行，除最终换行被丢弃。结果文本放入匿名临时文件，作为标准输入提供给命令。

`> name`、`>! name`、`>& name`、`>&! name`：文件 `name` 用作标准输出。若文件不存在则创建；若存在则截断，先前内容丢失。若设置了 `noclobber` shell 变量，则文件必须不存在或为字符特殊文件（例如终端或 **/dev/null**），否则出错。这有助于防止意外破坏文件。此时可使用 `!` 形式抑制此检查。若 `noclobber` 中给定 `notempty`，则允许对空文件使用 `>`；若设置 `ask`，则呈现交互式确认而非出错。涉及 `&` 的形式将诊断输出也路由到指定文件。`name` 的展开方式与 `<` 输入文件名相同。

`>> name`、`>>& name`、`>>! name`、`>>&! name`：类似 `>`，但将输出追加到 `name` 末尾。若设置了 `noclobber` shell 变量，则文件不存在即出错，除非使用 `!` 形式之一。

命令接收 shell 被调用时所处的环境，经输入/输出参数修改以及命令在管道中的存在调整。因此，与某些先前的 shell 不同，从 shell 命令文件运行的命令默认无法访问命令文本；它们接收 shell 的原始标准输入。应使用 `<<` 机制呈现内联数据。这允许 shell 命令脚本作为管道组件运行，并允许 shell 阻塞读取其输入。注意，分离运行的命令的默认标准输入不是空文件 **/dev/null**，而是 shell 的原始标准输入。若这是终端且进程尝试从终端读取，则进程会阻塞并通知用户（参见“作业”）。

诊断输出可通过管道与标准输出一起定向。只需使用 `|&` 而非 `|`。

shell 目前无法在不重定向标准输出的情况下重定向诊断输出，但 `(command > output-file) >& error-file` 通常是可接受的变通方法。`output-file` 或 `error-file` 可为 **/dev/tty** 以将输出发送到终端。

### 特性

描述了 shell 如何接受、解析和执行命令行后，现在转向其各种有用特性。

### 控制流

shell 包含许多命令，可用于在命令文件（shell 脚本）中以及（以有限但有用的方式）从终端输入调节控制流。这些命令都通过强制 shell 在其输入中重读或跳过来工作，由于实现原因，限制了某些命令的放置。

`foreach`、`switch` 和 `while` 语句以及 `if` 语句的 `if-then-else` 形式要求主要关键字在输入行的单个简单命令中出现，如下所示。

若 shell 的输入不可寻址，shell 在读取循环时缓冲输入，并在此内部缓冲中执行寻址以完成循环隐含的重读。（在允许的范围内，向后 `goto` 在不可寻址输入上会成功。）

### 表达式

`if`、`while` 和 `exit` 内建命令使用具有公共语法的表达式。表达式可包含下三节描述的任何运算符。注意 `@` 内建命令（参见下文）有自己的独立语法。

### 逻辑、算术和比较运算符

这些运算符类似于 C 的运算符，且具有相同的优先级。包括：

```
||  &&  |  ^  &  ==  !=  =~  !~  <=  >=
<  > <<  >>  +  -  *  /  %  !  ~  (  )
```

此处优先级向右递增，`==` `!=` `=~` 和 `!~`，`<=` `>=` `<` 和 `>`，`<<` 和 `>>`，`+` 和 `-`，`*` `/` 和 `%` 分别在同一级别。`==` `!=` `=~` 和 `!~` 运算符将参数作为字符串比较；其他都对数字操作。运算符 `=~` 和 `!~` 类似 `!=` 和 `==`，但右侧是 glob 模式（参见“文件名替换”），左侧操作数与之匹配。这减少了在 shell 脚本中使用 `switch` 内建命令的需求（当真正需要的只是模式匹配时）。

空或缺失的参数被视为 `0`。所有表达式的结果都是表示十进制数字的字符串。重要提示，表达式的两个组件不能出现在同一单词中；除非与对解析器有语法意义的组件（`&` `|` `<` `>` `(` `)`）相邻，否则它们应用空格包围。

### 命令退出状态

命令可在表达式中执行，其退出状态通过将其括在花括号（`{}`）中返回。记住花括号应用空格与命令的单词分隔。命令执行成功返回 true（即 `1`，若命令以状态 0 退出），否则返回 false（即 `0`）。若需要更详细的状态信息，应在表达式外执行命令并检查 `status` shell 变量。

### 文件查询运算符

其中一些运算符对文件及相关对象执行 true/false 测试。形式为 `-op file`，其中 `op` 是以下之一：

* `r`：读权限。
* `w`：写权限。
* `x`：执行权限。
* `X`：在路径中可执行或为 shell 内建，例如 `-X ls` 和 `-X ls-F` 通常为 true，但 `-X /bin/ls` 不是（+）。
* `e`：存在。
* `o`：所有权。
* `z`：零大小。
* `s`：非零大小（+）。
* `f`：普通文件。
* `d`：目录。
* `l`：符号链接（+）\*。
* `b`：块特殊文件（+）。
* `c`：字符特殊文件（+）。
* `p`：命名管道（fifo）（+）\*。
* `S`：套接字特殊文件（+）\*。
* `u`：设置 set-user-ID 位（+）。
* `g`：设置 set-group-ID 位（+）。
* `k`：设置粘滞位（+）。
* `t`：`file`（必须是数字）是终端设备的打开文件描述符（+）。
* `R`：已迁移（仅 Convex）（+）。
* `L`：在多运算符测试中，将后续运算符应用于符号链接本身而非链接指向的文件（+）\*。

`file` 经过命令和文件名展开，然后测试其是否与真实用户具有指定关系。若 `file` 不存在或不可访问，或对于标 `*` 的运算符，若指定文件类型在当前系统上不存在，则所有查询返回 false（即 `0`）。

这些运算符可组合以简洁：`-xy file` 等价于 `-x file && -y file`。（+）例如，`-fx` 对普通可执行文件为 true（返回 `1`），但对目录不为 true。

`L` 可在多运算符测试中使用，将后续运算符应用于符号链接本身而非链接指向的文件。例如，`-lLo` 对调用用户拥有的链接为 true。`Lr`、`Lw` 和 `Lx` 对链接始终为 true，对非链接为 false。`L` 在多运算符测试中作为最后一个运算符时有不同含义；见下文。

组合期望 `file` 是文件的运算符与不如此的运算符（例如 `X` 和 `t`）可能但无用，有时会误导。在 `L` 后跟非文件运算符可能导致特别奇怪的结果。

其他运算符返回其他信息（即不仅是 `0` 或 `1`）。（+）格式同前；`op` 可以是以下之一：

* `A`：文件最后访问时间，自纪元起的秒数。
* `A:`：类似 `A`，但为时间戳格式，例如 `Fri May 14 16:36:10 1993`。
* `M`：文件最后修改时间。
* `M:`：类似 `M`，但为时间戳格式。
* `C`：inode 最后修改时间。
* `C:`：类似 `C`，但为时间戳格式。
* `D`：设备号。
* `I`：inode 号。
* `F`：复合文件标识符，形式为 `device:inode`。
* `L`：符号链接指向的文件名。
* `N`：（硬）链接数。
* `P`：权限，八进制，无前导零。
* `P:`：类似 `P`，有前导零。
* `Pmode`：等价于 `-P file & mode`，例如 `-P22 file` 若 file 可被组和其他写则返回 `22`，仅组则 `20`，都不可则 `0`。
* `Pmode:`：类似 `Pmode`，有前导零。
* `U`：数字 userid。
* `U:`：用户名，若未知则为数字 userid。
* `G`：数字 groupid。
* `G:`：组名，若未知则为数字 groupid。
* `Z`：大小（字节）。

多运算符测试中仅可出现其中一个运算符，且必须是最后一个。注意 `L` 在多运算符测试末尾和其他位置有不同含义。由于 `0` 是许多这些运算符的有效返回值，失败时不返回 `0`：大多数返回 `-1`，`F` 返回 `:`。

若 shell 编译时定义了 POSIX（参见 `version` shell 变量），文件查询结果基于文件的权限位而非 `access(2)` 系统调用的结果。例如，若用 `-w` 测试一个普通允许写但位于只读挂载文件系统上的文件，POSIX shell 中测试会成功，非 POSIX shell 中会失败。

文件查询运算符也可通过 `filetest` 内建命令（参见下文）求值（+）。

### 作业

shell 将每个管道与一个作业关联。它维护当前作业表，由 `jobs` 命令打印，并为它们分配小整数编号。当作业以 `&` 异步启动时，shell 打印一行，如：

```
[1] 1234
```

表示异步启动的作业是作业号 1，有一个（顶层）进程，进程 ID 为 1234。

若你正在运行一个作业并想做其他事，可按挂起键（通常 `^Z`），向当前作业发送 STOP 信号。shell 通常会指示作业已“Suspended”并打印另一个提示符。若设置了 `listjobs` shell 变量，所有作业会像 `jobs` 内建命令那样列出；若设为 `long`，列表为长格式，如 `jobs -l`。然后你可以操作挂起作业的状态。可用 `bg` 命令将其放入“后台”，或运行其他命令并最终用 `fg` 将作业带回“前台”。（另见 `run-fg-editor` 编辑器命令。）`^Z` 立即生效，类似于中断，键入时待处理输出和未读输入被丢弃。`wait` 内建命令使 shell 等待所有后台作业完成。

`^]` 键向当前作业发送延迟挂起信号，该信号直到程序尝试 `read(2)` 它才生成 STOP 信号。当你为希望在其读取后停止的作业准备了一些命令时，这可有用地处前键入。`^Y` 键在 `csh(1)` 中执行此功能；在 `tcsh` 中，`^Y` 是编辑命令。（+）

后台运行的作业若尝试从终端读取则停止。后台作业通常被允许产生输出，但这可通过命令 `stty tostop` 禁用。若设置此 tty 选项，后台作业尝试产生输出时会停止，如同尝试读取输入时。

shell 中有多种引用作业的方式。字符 `%` 引入作业名。若希望引用作业 1，可命名为 `%1`。仅命名作业会将其带到前台；因此 `%1` 是 `fg %1` 的同义词，将作业 1 带回前台。类似地，`%1 &` 在后台恢复作业 1，如同 `bg %1`。作业也可由启动时键入字符串的明确前缀命名：`%ex` 通常会重启挂起的 `ex(1)` 作业（若只有一个名称以 `ex` 开头的挂起作业）。也可以说 `%?string` 指定文本包含 `string` 的作业（若只有一个此类作业）。

shell 维护当前和前一作业的概念。在作业相关输出中，当前作业标 `+`，前一作业标 `-`。缩写 `%+`、`%` 和（类推 `history` 机制语法）`%%` 都引用当前作业，`%-` 引用前一作业。

作业控制机制要求某些系统上设置 `stty(1)` 选项 `new`。这是 tty 驱动程序的“新”实现遗留物，允许从键盘生成中断字符以告诉作业停止。设置新 tty 驱动程序选项的详情见 `stty(1)` 和 `setty` 内建命令。

### 状态报告

shell 在进程状态改变时立即得知。它通常仅在打印提示符前通知你作业被阻塞以致无法继续，以免打扰你的工作。但若设置 `notify` shell 变量，shell 会立即通知后台作业状态变化。还有 `notify` shell 命令，标记单个进程使其状态变化立即报告。默认 `notify` 标记当前进程；启动后台作业后简单说 `notify` 即可标记它。

当你尝试在有停止作业时离开 shell，会警告“There are suspended jobs.”。可使用 `jobs` 命令查看它们。若你这样做或立即再次尝试退出，shell 不会再次警告，挂起的作业会被终止。

### 自动、周期性和定时事件（+）

在 shell“生命周期”中有多种方式在各种时间自动运行命令和采取其他行动。此处汇总，详细描述见相应“内建命令”、“特殊 shell 变量”和“特殊别名”。

`sched` 内建命令将命令放入计划事件列表，由 shell 在给定时间执行。

`beepcmd`、`cwdcmd`、`periodic`、`precmd`、`postcmd` 和 `jobcmd` 特殊别名可分别设置为在 shell 想响铃、工作目录改变、每 `tperiod` 分钟、每次提示前、每条命令执行前、每条命令执行后以及作业启动或带到前台时执行命令。

`autologout` shell 变量可设为在给定不活动分钟数后注销或锁定 shell。

`mail` shell 变量可设为定期检查新邮件。

`printexitvalue` shell 变量可设为打印以非零状态退出的命令的退出状态。

`rmstar` shell 变量可设为在键入 `rm *` 时询问用户是否真的如此。

`time` shell 变量可设为在耗时超过给定 CPU 秒数的任何进程完成后执行 `time` 内建命令。

`watch` 和 `who` shell 变量可设为报告选定用户登录或退出，`log` 内建命令随时报告这些用户。

### 本地语言系统支持（+）

shell 是 8 位干净的（若编译时如此；参见 `version` shell 变量），因此支持需要此能力的字符集。NLS 支持因 shell 是否编译为使用系统 NLS 而异（同样见 `version`）。无论哪种情况，7 位 ASCII 是默认字符代码（例如哪些字符可打印的分类）和排序，更改 `LANG` 或 `LC_CTYPE` 环境变量会检查这些方面的可能变化。

使用系统 NLS 时，调用 `setlocale(3)` 函数确定适当的字符代码/分类和排序（例如 `en_CA.UTF-8` 会得到“UTF-8”字符代码）。此函数通常检查 `LANG` 和 `LC_CTYPE` 环境变量；详情见系统文档。不使用系统 NLS 时，shell 模拟它，假设只要设置了 `LANG` 或 `LC_CTYPE` 之一（无论其值），就使用 ISO 8859-1 字符集。模拟 NLS 不影响排序。

此外，使用真实和模拟 NLS 时，范围 `\200`-`\377` 内的所有可打印字符（即具有 M-char 绑定的字符）自动重新绑定到 `self-insert-command`。对应的 escape-char 序列的绑定（若有）保持不变。若设置了 `NOREBIND` 环境变量，这些字符不重新绑定。这对于模拟 NLS 或假设完整 ISO 8859-1 的原始真实 NLS 可能有用。否则，范围 `\240`-`\377` 内的所有 M-char 绑定实际上被撤销。当然仍可用 `bindkey` 显式重新绑定相关键。

未知字符（既非可打印也非控制字符）以 `\nnn` 格式打印。若 tty 不在 8 位模式，其他 8 位字符通过转换为 ASCII 并使用 standout 模式打印。shell 从不更改 tty 的 7/8 位模式，并跟踪用户发起的 7/8 位模式更改。NLS 用户（或想使用元键的人）可能需要通过适当的 `stty(1)` 命令（在例如 **\~/.login** 文件中）显式将 tty 设为 8 位模式。

### 操作系统变体支持（+）

提供了许多新内建命令以支持特定操作系统的特性。均在“内建命令”节详细描述。

在支持 TCF 的系统上（aix-ibm370、aix-ps2），`getspath` 和 `setspath` 获取和设置系统执行路径，`getxvers` 和 `setxvers` 获取和设置实验版本前缀，`migrate` 在站点间迁移进程。`jobs` 内建命令打印每个作业执行的站点。

在 BS2000 下，`bs2cmd` 执行底层 BS2000/OSD 操作系统的命令。

在 Domain/OS 下，`inlib` 将共享库添加到当前环境，`rootnode` 更改根节点，`ver` 更改 systype。

在 Mach 下，`setpath` 等价于 Mach 的 `setpath(1)`。

在 Masscomp/RTU 和 Harris CX/UX 下，`universe` 设置 universe。

在 Harris CX/UX 下，`ucb` 或 `att` 在指定 universe 下运行命令。

在 Convex/OS 下，`warp` 打印或设置 universe。

`VENDOR`、`OSTYPE` 和 `MACHTYPE` 环境变量分别指示 shell 认为运行所在系统的供应商、操作系统和机器类型（微处理器类或机器型号）。在多种类型机器间共享主目录时特别有用；例如可在 **\~/.login** 中：

```
set path = (~/bin.$MACHTYPE /usr/ucb /bin /usr/bin .)
```

并将每台机器编译的可执行文件放入相应目录。

`version` shell 变量指示 shell 编译时选择的选项。

另注意 `newgrp` 内建、`afsuser` 和 `echo_style` shell 变量以及 shell 输入文件的系统相关位置（参见“文件”）。

### 信号处理

登录 shell 在读取文件 **\~/.logout** 时忽略中断。shell 除非以 `-q` 启动，否则忽略退出信号。登录 shell 捕获终止信号，非登录 shell 从父进程继承终止行为。其他信号具有 shell 从父进程继承的值。

在 shell 脚本中，shell 对中断和终止信号的处理可用 `onintr` 控制，对挂起信号的处理可用 `hup` 和 `nohup` 控制。

shell 在挂起时退出（另见 `logout` shell 变量）。默认情况下，shell 的子进程也如此，但 shell 退出时不向它们发送挂起。`hup` 安排 shell 退出时向子进程发送挂起，`nohup` 设置子进程忽略挂起。

### 终端管理（+）

shell 使用三组不同的终端（“tty”）模式：`edit`（编辑时使用）、`quote`（引用字面字符时使用）和 `execute`（执行命令时使用）。shell 在每种模式中保持某些设置不变，因此使 tty 处于混乱状态的命令不会干扰 shell。shell 还匹配 tty 速度和填充的变化。可使用 `setty` 内建命令检查和修改保持不变的 tty 模式列表。注意，虽然编辑器使用 CBREAK 模式（或其等价物），但它仍接受前向键入的字符。

`echotc`、`settc` 和 `telltc` 命令可从命令行操作和调试终端能力。

在支持 SIGWINCH 或 SIGWINDOW 的系统上，shell 自动适应窗口大小调整，并在设置时调整 `LINES` 和 `COLUMNS` 环境变量。若 `TERMCAP` 环境变量包含 `li#` 和 `co#` 字段，shell 将其调整为反映新窗口大小。

## 参考

下几节描述所有可用的内建命令、特殊别名和特殊 shell 变量。

### 内建命令

`%job`：`fg` 内建命令的同义词。

`%job &`：`bg` 内建命令的同义词。

`:`：什么也不做，成功。

`@`、`@ name = expr`、`@ name[index] = expr`、`@ name++|--`、`@ name[index]++|--`：第一种形式打印所有 shell 变量的值。第二种形式将 `expr` 的值赋给 `name`。第三种形式将 `expr` 的值赋给 `name` 的第 `index` 个组件；`name` 及其第 `index` 个组件必须已存在。`expr` 可包含 `*`、`+` 等运算符（如 C 中）。若 `expr` 包含 `<`、`>`、`&` 或 `` ` ``，则至少该部分 `expr` 必须放在 `()` 内。注意 `expr` 的语法与“表达式”中描述的无关。第四和第五种形式递增（`++`）或递减（`--`）`name` 或其第 `index` 个组件。`@` 与 `name` 之间的空格是必需的。`name` 与 `=` 之间以及 `=` 与 `expr` 之间的空格可选。`expr` 的组件必须用空格分隔。

`alias [name [wordlist]]`：无参数时打印所有别名。给定 `name` 时打印 `name` 的别名。给定 `name` 和 `wordlist` 时，将 `wordlist` 赋为 `name` 的别名。`wordlist` 经受命令和文件名替换。`name` 不能为 `alias` 或 `unalias`。另见 `unalias` 内建命令。

`alloc`：显示获取的动态内存量，分为已用和空闲。带参数时显示每个大小类别中空闲和已用块的数量。类别从大小 8 开始，每步加倍。此命令的输出可能因系统类型而异，因为 VAX 以外的系统可能使用不同的内存分配器。

`bg [%job ...]`：将指定作业（或无参数时的当前作业）放入后台，若停止则继续。`job` 可以是数字、字符串、\`\`、`%`、`+` 或 `-`，如“作业”中所述。

`bindkey [-l|-d|-e|-v|-u] (+)`、`bindkey [-a] [-b] [-k] [-r] [--] key (+)`、`bindkey [-a] [-b] [-k] [-c|-s] [--] key command (+)`：无选项时，第一种形式列出所有绑定的键及其绑定的编辑器命令，第二种形式列出 `key` 绑定的编辑器命令，第三种形式将编辑器命令 `command` 绑定到 `key`。选项包括：

* `-l`：列出所有编辑器命令及简短描述。
* `-d`：将所有键绑定到默认编辑器的标准绑定（如下 `-e` 和 `-v`）。
* `-e`：将所有键绑定到 `emacs(1)` 风格绑定。取消设置 `vimode`。
* `-v`：将所有键绑定到 `vi(1)` 风格绑定。设置 `vimode`。
* `-a`：列出或更改备用键映射中的键绑定。这是 `vimode` 命令模式中使用的键映射。
* `-b`：`key` 被解释为控制字符，写作 `^character`（如 `^A`）或 `C-character`（如 `C-A`）；元字符写作 `M-character`（如 `M-A`）；功能键写作 `F-string`（如 `F-string`）；扩展前缀键写作 `X-character`（如 `X-A`）。
* `-k`：`key` 被解释为符号方向键名，可以是 `down`、`up`、`left` 或 `right` 之一。
* `-r`：移除 `key` 的绑定。注意：`bindkey -r` 不会将 `key` 绑定到 `self-insert-command`，而是完全解除 `key` 绑定。
* `-c`：`command` 被解释为内建或外部命令而非编辑器命令。
* `-s`：`command` 被视为字面字符串，键入 `key` 时作为终端输入处理。`command` 中绑定的键本身被重新解释，持续十级解释。
* `--`：强制中断选项处理，使下一个单词被作为 `key`（即使以 `-` 开头）。
* `-u`（或任何无效选项）：打印用法消息。

`key` 可以是单字符或字符串。若命令绑定到字符串，字符串的第一个字符绑定到 `sequence-lead-in`，整个字符串绑定到该命令。`key` 中的控制字符可以是字面的（可通过前加 `quoted-insert` 编辑器命令键入，通常绑定到 `^V`）或 caret-character 风格（如 `^A`）。Delete 写作 `^?`。`key` 和 `command` 可包含反斜杠转义序列（System V `echo(1)` 风格）：`\a` 铃声、`\b` 退格、`\e` escape、`\f` 换页、`\n` 换行、`\r` 回车、`\t` 水平制表符、`\v` 垂直制表符、`\nnn` 八进制数 `nnn` 对应的 ASCII 字符。`\` 取消后跟字符的特殊含义（如有），特别是 `\` 和 `^`。

`bs2cmd bs2000-command (+)`：将 `bs2000-command` 传递给 BS2000 命令解释器执行。仅能执行非交互式命令，无法执行任何会覆盖当前进程映像的命令（如 /EXECUTE 或 /CALL-PROCEDURE）。（仅 BS2000）

`break`：使执行在最近的 `foreach` 或 `while` 的 `end` 之后恢复。当前行上的剩余命令被执行。因此通过将所有 break 写在一行可实现多级 break。

`breaksw`：从 `switch` 中断，在 `endsw` 后恢复。

`builtins (+)`：打印所有内建命令的名称。

`bye (+)`：`logout` 内建命令的同义词。仅当 shell 编译时如此可用；参见 `version` shell 变量。

`case label:`：`switch` 语句中的标签，如下所述。

`cd [-p] [-l] [-n|-v] [--] [name]`：若给定目录 `name`，将 shell 的工作目录改为 `name`。若未给定，改为 `home`（除非未设置 `cdtohome` 变量，此时需要 `name`）。若 `name` 为 `-`，解释为前一工作目录（参见“其他替换”）。（+）若 `name` 不是当前目录的子目录（且不以 `/`、`./` 或 `../` 开头），则检查 `cdpath` 变量的每个组件是否有子目录 `name`。最后，若一切失败但 `name` 是值以 `/` 或 `.` 开头的 shell 变量，则尝试看它是否为目录，隐含 `-p` 选项。带 `-p` 时，打印最终目录栈（如同 `dirs`）。`-l`、`-n` 和 `-v` 标志对 `cd` 的作用同 `dirs`，且隐含 `-p`。（+）使用 `--` 强制中断选项处理，使下一个单词被作为目录 `name`（即使以 `-` 开头）。（+）另见 `implicitcd` 和 `cdtohome` shell 变量。

`chdir`：`cd` 内建命令的同义词。

`complete [command [word/pattern/list[:select]/[[suffix]/] ...]] (+)`：无参数时列出所有补全。给定 `command` 时列出 `command` 的补全。给定 `command` 和 `word` 等时定义补全。`command` 可以是完整命令名或 glob 模式（参见“文件名替换”）。可以以 `-` 开头表示补全仅在 `command` 歧义时使用。`word` 指定相对于当前单词要补全的单词，可以是：

* `c`：当前单词补全。`pattern` 是必须匹配命令行当前单词开头的 glob 模式。补全当前单词时忽略 `pattern`。
* `C`：类似 `c`，但补全当前单词时包含 `pattern`。
* `n`：下一单词补全。`pattern` 是必须匹配命令行前一单词开头的 glob 模式。
* `N`：类似 `n`，但必须匹配当前单词前两个单词的开头。
* `p`：位置依赖补全。`pattern` 是数字范围，语法同索引 shell 变量，必须包含当前单词。

`list`（可能补全列表）可以是：

* `a`：别名。
* `b`：绑定（编辑器命令）。
* `c`：命令（内建或外部命令）。
* `C`：以提供的路径前缀开头的外部命令。
* `d`：目录。
* `D`：以提供的路径前缀开头的目录。
* `e`：环境变量。
* `f`：文件名。
* `F`：以提供的路径前缀开头的文件名。
* `g`：组名。
* `j`：作业。
* `l`：限制。
* `n`：无。
* `s`：shell 变量。
* `S`：信号。
* `t`：普通（“文本”）文件。
* `T`：以提供的路径前缀开头的普通（“文本”）文件。
* `v`：任何变量。
* `u`：用户名。
* `x`：类似 `n`，但使用 `list-choices` 时打印 `select`。
* `X`：补全。
* `$var`：变量 `var` 中的单词。
* `(...)`：给定列表中的单词。
* `` `...` ``：命令输出中的单词。

`select` 是可选的 glob 模式。若给定，仅 `list` 中匹配 `select` 的单词被考虑，且忽略 `fignore` shell 变量。最后三种补全类型不能有 `select` 模式，`x` 在使用 `list-choices` 编辑器命令时将 `select` 作为解释性消息。`suffix` 是追加到成功补全的单个字符。若为 null，不追加字符。若省略（此时第四个分隔符也可省略），目录追加斜杠，其他单词追加空格。

从 `` `...` `` 版本调用的 `command` 有附加环境变量 `COMMAND_LINE`，包含（如其名所示）当前（已键入）命令行的内容。可在自定义脚本中检查和使用 `COMMAND_LINE` 变量以构建更复杂的补全（见本包中包含的 `svn(1)` 的补全）。

现在是一些示例。某些命令仅接受目录作为参数，因此补全普通文件无意义：

```
> complete cd 'p/1/d/'
```

仅用目录补全 `cd` 后的第一个单词（`p/1`）。`p` 类型补全也可用于缩小命令补全：

```
> co[^D]
complete compress
> complete -co* 'p/0/(compress)/'
> co[^D]
> compress
```

此补全将命令（位置 0 的单词，`p/0`）以 `co` 开头（匹配 `co*`）补全为 `compress`（列表中唯一单词）。前导 `-` 表示此补全仅用于歧义命令。

```
> complete find 'n/-user/u/'
```

是 `n` 类型补全的示例。`find` 后紧跟 `-user` 的任何单词从用户列表补全。

```
> complete cc 'c/-I/d/'
```

演示 `c` 类型补全。`cc` 后以 `-I` 开头的任何单词补全为目录。`-I` 不作为目录的一部分，因为使用了小写 `c`。

不同命令适用不同的 `list`：

```
> complete alias 'p/1/a/'
> complete man 'p/*/c/'
> complete set 'p/1/s/'
> complete true 'p/1/x:Truth has no options./'
```

这些用别名补全 `alias` 后的单词，用命令补全 `man`，用 shell 变量补全 `set`。`true` 没有任何选项，因此 `x` 在尝试补全时不做任何事，列出补全选择时打印 `Truth has no options.`。

注意 `man` 示例及以下几个示例，可同样使用 `c/*` 或 `n/*` 而非 `p/*`。

可从补全时求值的变量补全单词：

```
> complete ftp 'p/1/$hostnames/'
> set hostnames = (rtfm.mit.edu tesla.ee.cornell.edu)
> ftp [^D]
rtfm.mit.edu tesla.ee.cornell.edu
> ftp [^C]
> set hostnames = (rtfm.mit.edu tesla.ee.cornell.edu uunet.uu.net)
> ftp [^D]
rtfm.mit.edu tesla.ee.cornell.edu uunet.uu.net
```

或从补全时运行的命令：

```
> complete kill 'p/*/`ps | awk {print $1}`/'
> kill -9 [^D]
23113 23377 23380 23406 23429 23529 23530 PID
```

注意 `complete` 命令本身不引用其参数，因此 `{print $1}` 中的花括号、空格和 `$` 必须显式引用。

一个命令可有多个补全：

```
> complete dbx 'p/2/(core)/' 'p/*/c/'
```

用 `core` 补全 `dbx` 的第二个参数，用命令补全所有其他参数。注意位置补全在下一单词补全之前指定。因为补全从左到右求值，若下一单词补全先指定，它将始终匹配，位置补全永远不会执行。这是定义补全时的常见错误。

`select` 模式在命令仅接受特定形式的文件作为参数时有用。例如：

```
> complete cc 'p/*/f:*.[cao]/'
```

将 `cc` 参数补全为仅以 `.c`、`.a` 或 `.o` 结尾的文件。`select` 也可排除文件，使用“文件名替换”中所述的 glob 模式取反。可使用：

```
> complete rm 'p/*/f:^*.{c,h,cc,C,tex,1,man,l,y}/'
```

以将珍贵源代码从 `rm` 补全中排除。当然，仍可手动键入排除的名称或使用 `complete-word-raw` 或 `list-choices-raw` 编辑器命令覆盖补全机制。

`C`、`D`、`F` 和 `T` `list` 分别类似 `c`、`d`、`f` 和 `t`，但以不同方式使用 `select` 参数：将补全限制为以特定路径前缀开头的文件。例如，Elm 邮件程序使用 `=` 作为邮件目录的缩写。可使用：

```
> complete elm c@=@F:$HOME/Mail/@
```

将 `elm -f =` 补全为如同 `elm -f ~/Mail/`。注意使用 `@` 而非 `/` 以避免与 `select` 参数混淆，使用 `$HOME` 而非 `~`，因为主目录替换仅在单词开头有效。

`suffix` 用于向补全单词添加非标准后缀（非空格或目录的 `/`）：

```
> complete finger 'c/*@/$hostnames/' 'p/1/u/@'
```

从用户列表补全 `finger` 参数，追加 `@`，然后在 `@` 后从 `hostnames` 变量补全。再次注意补全指定的顺序。

最后，一个复杂示例供启发：

```
> complete find \
'n/-name/f/' 'n/-newer/f/' 'n/-{,n}cpio/f/' \
'n/-exec/c/' 'n/-ok/c/' 'n/-user/u/' \
'n/-group/g/' 'n/-fstype/(nfs 4.2)/' \
'n/-type/(b c d f l p s)/' \
'c/-/(name newer cpio ncpio exec ok user \
group fstype type atime ctime depth inum \
ls mtime nogroup nouser perm print prune \
size xdev)/' \
'p/*/d/'
```

这将 `-name`、`-newer`、`-cpio` 或 `ncpio`（注意匹配两者的模式）后的单词补全为文件，`-exec` 或 `-ok` 后的单词补全为命令，`user` 和 `group` 后的单词补全为用户和组，`-fstype` 或 `-type` 后的单词补全为给定列表的成员。还从给定列表补全开关本身（注意使用 `c` 类型补全），并将其他未补全的内容补全为目录。

记住，若被补全的单词是波浪号替换（以 `~` 开头）或变量（以 `$` 开头），则编程补全被忽略。另见 `uncomplete` 内建命令。

`continue`：继续执行最近的 `while` 或 `foreach`。当前行的其余命令被执行。

`default:`：在 `switch` 语句中标记默认情况。应位于所有 `case` 标签之后。

`dirs [-l] [-n|-v]`、`dirs -S|-L [filename] (+)`、`dirs -c (+)`：第一种形式打印目录栈。栈顶在左，栈中第一个目录是当前目录。带 `-l` 时，输出中的 `~` 或 `~name` 显式展开为 `home` 或用户 `name` 的主目录路径名。（+）带 `-n` 时，条目在到达屏幕边缘前换行。（+）带 `-v` 时，条目每行一个，前面有栈位置。（+）若给定多个 `-n` 或 `-v`，`-v` 优先。`-p` 被接受但什么也不做。带 `-S` 时，第二种形式将目录栈作为一系列 `cd` 和 `pushd` 命令保存到 `filename`。带 `-L` 时，shell source `filename`（推测是由 `-S` 选项或 `savedirs` 机制保存的目录栈文件）。两种情况下，若未给定 `filename` 则使用 `dirsfile`，若 `dirsfile` 未设置则使用 **\~/.cshdirs**。注意登录 shell 在启动时执行等价于 `dirs -L` 的操作，若设置了 `savedirs`，退出前执行 `dirs -S`。因为通常仅 **\~/.tcshrc** 在 **\~/.cshdirs** 之前被 source，`dirsfile` 应在 **\~/.tcshrc** 而非 **\~/.login** 中设置。最后一种形式清除目录栈。

`echo [-n] word ...`：将每个 `word` 写入 shell 标准输出，以空格分隔，以换行终止。`echo_style` shell 变量可设为模拟（或不模拟）BSD 和/或 System V 版本 `echo` 的标志和转义序列；参见 `echo(1)`。

`echotc [-sv] arg ... (+)`：运用 `args` 中的终端能力（参见 `termcap(5)`）。例如 `echotc home` 将光标发送到起始位置，`echotc cm 3 10` 发送到第 3 列第 10 行，`echotc ts 0; echo "This is a test."; echotc fs` 在状态行打印 “This is a test.”。若 `arg` 为 `baud`、`cols`、`lines`、`meta` 或 `tabs`，打印该能力的值（“yes”或“no”表示终端有或无该能力）。可用此使 shell 脚本输出在慢终端上更简洁，或限制命令输出为屏幕行数：

```
> set history=`echotc lines`
> @ history--
```

termcap 字符串可能包含无法正确 echo 的通配符。将 shell 变量设为终端能力字符串时应使用双引号，如下例将日期放入状态行：

```
> set tosl="`echotc ts 0`"
> set frsl="`echotc fs`"
> echo -n "$tosl";date; echo -n "$frsl"
```

带 `-s` 时，不存在的能力返回空字符串而非出错。带 `-v` 时，消息为详细模式。

`else`、`end`、`endif`、`endsw`：见下文 `foreach`、`if`、`switch` 和 `while` 语句描述。

`eval arg ...`：将参数视为 shell 输入并在当前 shell 上下文中执行结果命令。通常用于执行命令或变量替换产生的命令，因为解析在这些替换之前发生。`tset(1)` 有 `eval` 的示例用法。

`exec command`：用指定命令替换当前 shell 执行。

`exit [expr]`：shell 以指定 `expr` 的值（表达式，如“表达式”中所述）退出，或无 `expr` 时以值 0 退出。

`fg [%job ...]`：将指定作业（或无参数时的当前作业）带到前台，若停止则继续。`job` 可以是数字、字符串、\`\`、`%`、`+` 或 `-`，如“作业”中所述。另见 `run-fg-editor` 编辑器命令。

`filetest -op file ... (+)`：将 `op`（如“文件查询运算符”中所述的文件查询运算符）应用于每个 `file` 并以空格分隔列表返回结果。

`foreach name (wordlist)` ... `end`：依次将变量 `name` 设为 `wordlist` 的每个成员，并执行此命令与匹配 `end` 之间的命令序列。（`foreach` 和 `end` 都必须独占单独行。）内建命令 `continue` 可用于提前继续循环，`break` 提前终止。从终端读取此命令时，循环在执行循环内任何语句前以 `foreach?` （或 `prompt2`）提示读取一次。若在终端键入循环时出错，可将其擦除。

`getspath (+)`：打印系统执行路径。（仅 TCF）

`getxvers (+)`：打印实验版本前缀。（仅 TCF）

`glob wordlist`：类似 `echo`，但不识别 `-n` 参数，输出中单词以 null 字符分隔。用于希望使用 shell 文件名展开单词列表的程序。

`goto word`：`word` 经受文件名和命令替换，产生 `label` 形式的字符串。shell 尽可能回卷输入，搜索 `label:` 形式（可能前面有空白或制表符）的行，并在该行之后继续执行。

`hashstat`：打印统计行，指示内部哈希表在定位命令（及避免 `exec`）方面的效果。对 `path` 中哈希函数指示可能命中的每个组件以及不以 `/` 开头的每个组件尝试 `exec`。在没有 `vfork(2)` 的机器上，仅打印哈希桶的数量和大小。

`history [-hTr] [n]`、`history -S|-L|-M [filename] (+)`、`history -c (+)`：第一种形式打印历史事件列表。若给定 `n` 仅打印或保存最近 `n` 个事件。带 `-h` 时，历史列表无前导编号打印。若指定 `-T`，时间戳也以注释形式打印。（这可用于产生适合 `history -L` 或 `source -h` 加载的文件。）带 `-r` 时，打印顺序为最新在前而非最旧在前。带 `-S` 时，第二种形式将历史列表保存到 `filename`。若 `savehist` shell 变量的第一个单词设为数字，最多保存那么多行。若 `savehist` 的第二个单词设为 `merge`，历史列表与现有历史文件合并而非替换（若有），并按时间戳排序。（+）合并适用于 X Window System 等多 shell 同时使用的环境。若 `savehist` 的第二个单词为 `merge` 且第三个单词设为 `lock`，历史文件更新将与可能想同时合并历史的其他 shell 会话串行化。带 `-L` 时，shell 将 `filename`（推测是由 `-S` 选项或 `savehist` 机制保存的历史列表）追加到历史列表。`-M` 类似 `-L`，但将 `filename` 内容合并到历史列表并按时间戳排序。两种情况下，若未给定 `filename` 则使用 `histfile`，若 `histfile` 未设置则使用 **\~/.history**。`history -L` 完全类似 `source -h`，只是不需要文件名。注意登录 shell 在启动时执行等价于 `history -L` 的操作，若设置了 `savehist`，退出前执行 `history -S`。因为通常仅 **\~/.tcshrc** 在 **\~/.history** 之前被 source，`histfile` 应在 **\~/.tcshrc** 而非 **\~/.login** 中设置。若设置了 `histlit`，第一种和第二种形式打印和保存历史列表的字面（未展开）形式。最后一种形式清除历史列表。

`hup [command] (+)`：带 `command` 时，运行 `command` 使其在挂起信号时退出，并安排 shell 退出时向其发送挂起信号。注意命令可设置自己的挂起响应，覆盖 `hup`。无参数时，使非交互式 shell 在脚本剩余部分遇挂起时退出。另见“信号处理”和 `nohup` 内建命令。

`if (expr) command`：若 `expr`（表达式，如“表达式”中所述）求值为 true，则执行 `command`。`command` 的变量替换提前发生，与其余 `if` 命令同时。`command` 必须是简单命令，不能是别名、管道、命令列表或括号命令列表，但可有参数。即使 `expr` 为 false 且 `command` 未执行，输入/输出重定向仍发生；这是一个 bug。

`if (expr) then` ... `else if (expr2) then` ... `else` ... `endif`：若指定 `expr` 为 true，则执行到第一个 `else` 的命令；否则若 `expr2` 为 true，则执行到第二个 `else` 的命令，依此类推。可有任意数量的 `else-if` 对；仅需一个 `endif`。`else` 部分同样可选。（`else` 和 `endif` 必须出现在输入行开头；`if` 必须独占其输入行或在 `else` 之后。）

`inlib shared-library ... (+)`：将每个 `shared-library` 添加到当前环境。无法移除共享库。（仅 Domain/OS）

`jobs [-l]`：列出活动作业。带 `-l` 时，除正常信息外还列出进程 ID。在 TCF 系统上，打印每个作业执行的站点。

`kill [-s signal] %job|pid ...`、`kill -l`：第一种和第二种形式向指定作业或进程发送指定 `signal`（若未给定则为 TERM 信号）。`job` 可以是数字、字符串、\`\`、`%`、`+` 或 `-`，如“作业”中所述。信号可按数字或名称给定（如 **/usr/include/signal.h** 中所示，去掉前缀 `SIG`）。没有默认 `job`；仅说 `kill` 不会向当前作业发送信号。若发送的信号为 TERM 或 HUP，则还向作业或进程发送 CONT 信号。第三种形式列出信号名称。

`limit [-h] [resource [maximum-use]]`：限制当前进程及其创建的每个进程在指定 `resource` 上不超过 `maximum-use`。若未给定 `maximum-use`，则打印当前限制；若未给定 `resource`，则给出所有限制。若给定 `-h` 标志，使用硬限制而非当前限制。硬限制对当前限制的值施加上限。仅超级用户可提高硬限制，但用户可在合法范围内降低或提高当前限制。当前可控制的资源（若操作系统支持）包括：

* `cputime`：每个进程使用的最大 CPU 秒数。
* `filesize`：可创建的最大单个文件。
* `datasize`：通过 `sbrk(2)` 在程序文本结尾之外的数据+栈区域最大增长。
* `stacksize`：自动扩展栈区域的最大大小。
* `coredumpsize`：将创建的最大核心转储大小。
* `memoryuse`：进程在给定时间可分配的最大物理内存量。
* `vmemoryuse`：进程在给定时间可分配的最大虚拟内存量（地址空间）。
* `heapsize`：进程每次 `brk()` 系统调用可分配的最大内存量。
* `descriptors` 或 `openfiles`：此进程的最大打开文件数。
* `pseudoterminals`：此用户的最大伪终端数。
* `kqueues`：为此进程分配的最大 kqueue 数。
* `concurrency`：此进程的最大线程数。
* `memorylocked`：进程可通过 `mlock(2)` 锁定到内存的最大大小。
* `maxproc`：此用户 ID 的最大同时进程数。
* `maxthread`：此用户 ID 的最大同时线程（轻量级进程）数。
* `threads`：此进程的最大线程数。
* `sbsize`：此用户的最大套接字缓冲区使用大小。
* `swapsize`：此用户保留或使用的最大交换空间。
* `maxlocks`：此用户的最大锁数。
* `posixlocks`：此用户的最大 POSIX 咨询锁数。
* `maxsignal`：此用户的最大待处理信号数。
* `maxmessage`：此用户的 POSIX mqueue 中最大字节数。
* `maxnice`：此用户允许提高的最大 nice 优先级，从 \[19...-20] 映射到 \[0...39]。
* `maxrtprio`：此用户的最大实时优先级。
* `maxrttime`：此用户 RT 任务的超时时间（微秒）。

`maximum-use` 可给定为（浮点或整数）数字后跟比例因子。对于除 `cputime` 外的所有限制，默认比例为 `k` 或 `kilobytes`（1024 字节）；也可使用 `m` 或 `megabytes` 或 `g` 或 `gigabytes`。对于 `cputime`，默认缩放为 `seconds`，而 `m` 表示分钟，`h` 表示小时，或 `mm:ss` 形式的时间（给分钟和秒）。若 `maximum-use` 为 `unlimited`，则移除对指定 `resource` 的限制（等价于 `unlimit` 内建命令）。对于 `resource` 名称和比例因子，名称的明确前缀即可。

`log (+)`：打印 `watch` shell 变量并报告 `watch` 中指示的每个已登录用户（无论他们上次何时登录）。另见 `watchlog`。

`login`：终止登录 shell，用 `bin/login` 实例替换。这是一种注销方式，为与 `sh(1)` 兼容而保留。

`logout`：终止登录 shell。若设置了 `ignoreeof` 特别有用。

`ls-F [-switch ...] [file ...] (+)`：类似 `ls -F` 列出文件，但快得多。在列表中用特殊字符标识每种特殊文件类型：

* `/`：目录。
* `*`：可执行文件。
* `#`：块设备。
* `%`：字符设备。
* `|`：命名管道（仅限有命名管道的系统）。
* `=`：套接字（仅限有套接字的系统）。
* `@`：符号链接（仅限有符号链接的系统）。
* `+`：隐藏目录（仅 AIX）或上下文相关（仅 HP/UX）。
* `:`：网络特殊（仅 HP/UX）。

若设置了 `listlinks` shell 变量，符号链接更详细标识（当然仅限有符号链接的系统）：

* `@`：指向非目录的符号链接。
* `>`：指向目录的符号链接。
* `&`：指向无处的符号链接。

`listlinks` 还会减慢 `ls-F` 并导致挂载符号链接指向的文件所在的分区。若 `listflags` shell 变量设为 `x`、`a` 或 `A` 或其任意组合（如 `xA`），它们作为 `ls-F` 的标志，使其行为类似 `ls -xF`、`ls -Fa`、`ls -FA` 或组合（如 `ls -FxA`）。在 `ls -C` 非默认的机器上，`ls-F` 行为类似 `ls -CF`，除非 `listflags` 包含 `x`，此时行为类似 `ls -xF`。`ls-F` 若给定任何开关则将参数传递给 `ls(1)`，因此 `alias ls ls-F` 通常正确。

`ls-F` 内建可根据文件类型或扩展名使用不同颜色列出文件。参见 `color` shell 变量和 `LS_COLORS` 环境变量。

`migrate [-site] pid|%jobid ... (+)`、`migrate -site (+)`：第一种形式将进程或作业迁移到指定站点或系统路径确定的默认站点。第二种形式等价于 `migrate -site $$`：将当前进程迁移到指定站点。迁移 shell 本身可能导致意外行为，因为 shell 不喜欢失去其 tty。（仅 TCF）

`newgrp [-] [group] (+)`：等价于 `exec newgrp`；参见 `newgrp(1)`。仅当 shell 编译时如此可用；参见 `version` shell 变量。

`nice [+number] [command]`：将 shell 的调度优先级设为 `number`，或无 `number` 时为 4。带 `command` 时，以适当优先级运行 `command`。`number` 越大，进程获得的 CPU 越少。超级用户可通过 `nice -number ...` 指定负优先级。命令始终在子 shell 中执行，简单 `if` 语句中命令的限制适用。

`nohup [command]`：带 `command` 时，运行 `command` 使其忽略挂起信号。注意命令可设置自己的挂起响应，覆盖 `nohup`。无参数时，使非交互式 shell 在脚本剩余部分忽略挂起。另见“信号处理”和 `hup` 内建命令。

`notify [%job ...]`：使 shell 在任何指定作业（或无 `%job` 时的当前作业）状态变化时异步通知用户，而非如通常等到下次提示。`job` 可以是数字、字符串、\`\`、`%`、`+` 或 `-`，如“作业”中所述。另见 `notify` shell 变量。

`onintr [-|label]`：控制 shell 对中断的行动。无参数时，恢复 shell 对中断的默认行动（终止 shell 脚本或返回终端命令输入级）。带 `-` 时，忽略所有中断。带 `label` 时，使 shell 在收到中断或子进程因中断终止时执行 `goto label`。`onintr` 在 shell 分离运行和系统启动文件（参见“文件”）中被忽略，因为反正中断被禁用。

`popd [-p] [-l] [-n|-v] [+n]`：无参数时，弹出目录栈并返回到新栈顶目录。带数字 `+n` 时，丢弃栈中第 `n` 个条目。最后，所有 `popd` 形式打印最终目录栈（如同 `dirs`）。`pushdsilent` shell 变量可设为阻止此行为，`-p` 标志可覆盖 `pushdsilent`。`-l`、`-n` 和 `-v` 标志对 `popd` 的作用同 `dirs`。（+）

`printenv [name] (+)`：打印所有环境变量的名称和值，或给定 `name` 时打印环境变量 `name` 的值。

`pushd [-p] [-l] [-n|-v] [name|+n]`：无参数时，交换目录栈顶两个元素。若设置了 `pushdtohome`，无参数的 `pushd` 执行 `pushd ~`，类似 `cd`。（+）带 `name` 时，将当前工作目录推入目录栈并改为 `name`。若 `name` 为 `-`，解释为前一工作目录（参见“文件名替换”）。（+）若设置了 `dunique`，`pushd` 在将 `name` 推入栈前移除栈中所有 `name` 实例。（+）带数字 `+n` 时，将目录栈第 `n` 个元素旋转到栈顶并改为它。若设置了 `dextract`，`pushd +n` 提取第 `n` 个目录，推到栈顶并改为它。（+）最后，所有 `pushd` 形式打印最终目录栈（如同 `dirs`）。`pushdsilent` shell 变量可设为阻止此行为，`-p` 标志可覆盖 `pushdsilent`。`-l`、`-n` 和 `-v` 标志对 `pushd` 的作用同 `dirs`。（+）

`rehash`：使 `path` 变量中目录内容的内部哈希表重新计算。若未设置 `autorehash` shell 变量且登录时向 `path` 中目录添加新命令，则需要此操作。带 `autorehash` 时，新命令会自动找到，除非哈希表中已存在位于不同目录的同名命令这种特殊情况。还刷新由波浪号展开构建的主目录缓存。

`repeat count command`：执行指定 `command` `count` 次，`command` 受与上述单行 `if` 语句中 `command` 相同的限制。即使 `count` 为 0，I/O 重定向也精确发生一次。

`rootnode //nodename (+)`：将根节点改为 **//nodename**，使 `/` 被解释为 `//nodename`。（仅 Domain/OS）

`sched (+)`、`sched [+]hh:mm command (+)`、`sched -n (+)`：第一种形式打印计划事件列表。`sched` shell 变量可设为定义计划事件列表的打印格式。第二种形式将 `command` 添加到计划事件列表。例如：

```
> sched 11:00 echo It\'s eleven o\'clock.
```

使 shell 在上午 11 点 echo `It's eleven o'clock.`。时间可为 12 小时 AM/PM 格式：

```
> sched 5pm set prompt='[%h] It\'s after 5; go home: >'
```

或相对于当前时间：

```
> sched +2:15 /usr/lib/uucp/uucico -r1 -sother
```

相对时间说明不能使用 AM/PM 格式。第三种形式从事件列表移除第 `n` 项：

```
> sched
     1  Wed Apr  4 15:42  /usr/lib/uucp/uucico -r1 -sother
     2  Wed Apr  4 17:00  set prompt=[%h] It's after 5; go home: >
> sched -2
> sched
     1  Wed Apr  4 15:42  /usr/lib/uucp/uucico -r1 -sother
```

计划事件列表中的命令在命令计划时间之后的第一个提示打印前执行。可能错过命令应运行的确切时间，但逾期命令会在下次提示执行。shell 等待用户输入时到期的命令立即执行。但已运行命令的正常操作不会被中断以运行计划事件列表元素。此机制类似但不完全相同于某些 Unix 系统上的 `at(1)` 命令。其主要缺点是可能不在确切指定时间运行命令。其主要优点是由于 `sched` 直接从 shell 运行，它可访问 shell 变量和其他结构。这提供了基于一天中时间更改工作环境的机制。

`set`、`set name ...`、`set name=word ...`、`set [-r] [-f|-l] name=(wordlist) ... (+)`、`set name[index]=word ...`、`set -r (+)`、`set -r name ... (+)`、`set -r name=word ... (+)`：第一种形式打印所有 shell 变量的值。包含多个单词的变量以括号单词列表形式打印。第二种形式将 `name` 设为空字符串。第三种形式将 `name` 设为单个 `word`。第四种形式将 `name` 设为 `wordlist` 中的单词列表。所有情况下值经受命令和文件名展开。若指定 `-r`，值设为只读。若指定 `-f` 或 `-l`，仅设置保持顺序的唯一单词。`-f` 偏好单词首次出现，`-l` 末次。第五种形式将 `name` 的第 `index` 个组件设为 `word`；此组件必须已存在。第六种形式仅列出所有只读 shell 变量的名称。第七种形式使 `name` 只读，无论是否有值。第八种形式同第三种，但同时使 `name` 只读。这些参数可重复以在单个 `set` 命令中设置和/或使多个变量只读。但注意，变量展开在所有设置发生前为所有参数发生。还注意 `=` 可与 `name` 和 `word` 都相邻或与两者都用空白分隔，但不能仅与其中一个相邻。另见 `unset` 内建命令。

`setenv [name [value]]`：无参数时打印所有环境变量的名称和值。给定 `name` 时，将环境变量 `name` 设为 `value`，或无 `value` 时为空字符串。

`setpath path (+)`：等价于 `setpath(1)`。（仅 Mach）

`setspath LOCAL|site|cpu ... (+)`：设置系统执行路径。（仅 TCF）

`settc cap value (+)`：告知 shell 相信终端能力 `cap`（如 `termcap(5)` 中定义）的值为 `value`。无健全性检查。Concept 终端用户可能需要 `settc xn no` 以在最右列正确换行。

`setty [-d|-q|-x] [-a] [[+|-]mode] (+)`：控制 shell 不允许更改的 tty 模式（参见“终端管理”）。`-d`、`-q` 或 `-x` 告诉 `setty` 分别作用于 `edit`、`quote` 或 `execute` tty 模式集；无 `-d`、`-q` 或 `-x` 时使用 `execute`。无其他参数时，`setty` 列出所选集中固定开（`+mode`）或关（`-mode`）的模式。可用模式因此显示因系统而异。带 `-a` 时，列出所选集中所有 tty 模式（无论是否固定）。带 `+mode`、`-mode` 或 `mode` 时，在所选集中将 `mode` 固定开或关或移除控制。例如 `setty +echok echoe` 固定 `echok` 模式开，并允许命令在 shell 执行命令时打开或关闭 `echoe` 模式。

`setxvers [string] (+)`：将实验版本前缀设为 `string`，或省略 `string` 时移除它。（仅 TCF）

`shift [variable]`：无参数时，丢弃 `argv[1]` 并将 `argv` 成员左移。`argv` 未设置或少于一个单词时出错。带 `variable` 时，对 `variable` 执行相同功能。

`source [-h] name [args ...]`：shell 从 `name` 读取并执行命令。命令不放入历史列表。若给定任何 `args`，放入 `argv`。（+）`source` 命令可嵌套；若嵌套过深，shell 可能用尽文件描述符。任何级别 `source` 中的错误终止所有嵌套 `source` 命令。带 `-h` 时，命令放入历史列表而非执行，类似 `history -L`。

`stop %job|pid ...`：停止指定在后台执行的作业或进程。`job` 可以是数字、字符串、\`\`、`%`、`+` 或 `-`，如“作业”中所述。没有默认 `job`；仅说 `stop` 不停止当前作业。

`suspend`：使 shell 停止，如同以 `^Z` 发送停止信号。最常用于停止 `su(1)` 启动的 shell。

`switch (string)` ... `case str1:` ... `breaksw` ... `default:` ... `breaksw` ... `endsw`：每个 case 标签依次与指定的 `string`（首先经受命令和文件名展开）匹配。文件元字符 `*`、`?` 和 `[...]` 可用于 case 标签（经受变量展开）。若在 `default` 标签前无标签匹配，则在 default 标签后开始执行。每个 case 标签和 default 标签必须出现在行首。`breaksw` 命令使执行在 `endsw` 后继续。否则控制可如 C 中那样穿过 case 标签和 default 标签。若无标签匹配且无 default，执行在 `endsw` 后继续。

`telltc (+)`：列出所有终端能力的值（参见 `termcap(5)`）。

`termname [terminal type] (+)`：测试 `terminal type`（或若未给定则为 `TERM` 的当前值）在主机 termcap(5) 或 terminfo(5) 数据库中是否有条目。若有条目则向 stdout 打印终端类型并返回 0，否则返回 1。

`time [command]`：执行 `command`（必须是简单命令，不能是别名、管道、命令列表或括号命令列表）并按 `time` 变量所述打印时间摘要。必要时创建额外 shell 在命令完成时打印时间统计。无 `command` 时，打印当前 shell 及其子进程的时间摘要。

`umask [value]`：将文件创建掩码设为 `value`（八进制）。常见掩码值为 002（给组所有访问权限，给其他读写和执行权限）和 022（给组和其他读写和执行权限）。无 `value` 时，打印当前文件创建掩码。

`unalias pattern`：移除所有名称匹配 `pattern` 的别名。`unalias *` 因此移除所有别名。无 `unalias` 的内容不算错误。

`uncomplete pattern (+)`：移除所有名称匹配 `pattern` 的补全。`uncomplete *` 因此移除所有补全。无 `uncomplete` 的内容不算错误。

`unhash`：禁用内部哈希表以加速定位执行的程序。

`universe universe (+)`：将 universe 设为 `universe`。（仅 Masscomp/RTU）

`unlimit [-hf] [resource]`：移除对 `resource` 的限制，或未指定 `resource` 时移除所有限制。带 `-h` 时，移除相应硬限制。仅超级用户可执行此操作。注意 `unlimit` 可能不成功退出，因为大多数系统不允许 `descriptors` 无限制。带 `-f` 时忽略错误。

`unset pattern`：移除所有名称匹配 `pattern` 的变量（除非只读）。`unset *` 因此移除所有变量（除非只读）；这是个坏主意。无 `unset` 的内容不算错误。

`unsetenv pattern`：移除所有名称匹配 `pattern` 的环境变量。`unsetenv *` 因此移除所有环境变量；这是个坏主意。无 `unsetenv` 的内容不算错误。

`ver [systype [command]] (+)`：无参数时打印 `SYSTYPE`。带 `systype` 时，将 `SYSTYPE` 设为 `systype`。带 `systype` 和 `command` 时，在 `systype` 下执行 `command`。`systype` 可为 `bsd4.3` 或 `sys5.3`。（仅 Domain/OS）

`wait`：shell 等待所有后台作业。若 shell 是交互式的，中断会打断等待并使 shell 打印所有未完成作业的名称和编号。

`warp universe (+)`：将 universe 设为 `universe`。（仅 Convex/OS）

`watchlog (+)`：`log` 内建命令（参见下文）的替代名称。仅当 shell 编译时如此可用；参见 `version` shell 变量。

`where command (+)`：报告 `command` 的所有已知实例，包括别名、内建和 `path` 中的可执行文件。

`which command (+)`：显示 shell 在替换、`path` 搜索等后 will 执行的命令。内建命令类似 `which(1)`，但正确报告 `tcsh` 别名和内建，且快 10 到 100 倍。另见 `which-command` 编辑器命令。

`while (expr)` ... `end`：当 `expr`（表达式，如“表达式”中所述）求值为非零时，执行 `while` 与匹配 `end` 之间的命令。`while` 和 `end` 必须独占其输入行。`break` 和 `continue` 可用于提前终止或继续循环。若输入是终端，用户首次通过循环时如 `foreach` 那样提示。

### 特殊别名（+）

若设置，这些别名中每个在指示的时间自动执行。它们最初都未定义。

`beepcmd`：当 shell 想响终端铃时运行。

`cwdcmd`：每次工作目录改变后运行。例如，若用户在 X 窗口系统上使用 `xterm(1)` 和支持标题栏的重父窗口管理器（如 `twm(1)`）：

```
> alias cwdcmd  'echo -n "^[]2;${HOST}:$cwd ^G"'
```

则 shell 会将运行中 `xterm(1)` 的标题更改为主机名、冒号和完整当前工作目录。更花哨的方式：

```
> alias cwdcmd 'echo -n "^[]2;${HOST}:$cwd^G^[]1;${HOST}^G"'
```

这会将主机名和工作目录放在标题栏，但仅将主机名放在图标管理器菜单。注意将 `cd`、`pushd` 或 `popd` 放入 `cwdcmd` 可能导致无限循环。作者认为任何这样做的人都会得到应得的。

`jobcmd`：每条命令执行前或命令状态改变时运行。类似 `postcmd`，但不打印内建。

```
> alias jobcmd  'echo -n "^[]2\;\!#:q^G"'
```

则执行 `vi foo.c` 会将命令字符串放入 xterm 标题栏。

`helpcommand`：由 `run-help` 编辑器命令调用。寻求帮助的命令名作为唯一参数传递。例如：

```
> alias helpcommand '\!:1 --help'
```

则命令本身的帮助显示会被调用，使用 GNU 帮助调用约定。目前无法轻松考虑各种调用约定（如通常的 Unix `-h`），除非使用多命令表。

`periodic`：每 `tperiod` 分钟运行。这提供了检查常见但不频繁变化（如新邮件）的便捷方式。例如：

```
> set tperiod = 30
> alias periodic checknews
```

则 `checknews(1)` 程序每 30 分钟运行。若设置了 `periodic` 但 `tperiod` 未设置或设为 0，`periodic` 行为类似 `precmd`。

`precmd`：每次提示打印前运行。例如：

```
> alias precmd date
```

则 `date(1)` 在 shell 每次提示命令前运行。`precmd` 可设为做什么没有限制，但应谨慎使用。

`postcmd`：每条命令执行前运行。

```
> alias postcmd  'echo -n "^[]2\;\!#:q^G"'
```

则执行 `vi foo.c` 会将命令字符串放入 xterm 标题栏。

`shell`：为本身未指定解释器的可执行脚本指定解释器。第一个单词应为所需解释器的完整路径名（如 `/bin/csh` 或 `/usr/local/bin/tcsh`）。

### 特殊 shell 变量

本节描述的变量对 shell 有特殊含义。

shell 在启动时设置 `addsuffix`、`argv`、`autologout`、`csubstnonl`、`command`、`echo_style`、`edit`、`gid`、`group`、`home`、`loginsh`、`oid`、`path`、`prompt`、`prompt2`、`prompt3`、`shell`、`shlvl`、`tcsh`、`term`、`tty`、`uid`、`user` 和 `version`；除非用户更改，否则之后不变。shell 必要时更新 `cwd`、`dirstack`、`owd` 和 `status`，注销时设置 `logout`。

shell 将 `group`、`home`、`path`、`shlvl`、`term` 和 `user` 与同名环境变量同步：每当环境变量变化时，shell 更改相应 shell 变量以匹配（除非 shell 变量只读），反之亦然。注意虽然 `cwd` 和 `PWD` 含义相同，但不以这种方式同步，且 shell 自动在 `path` 和 `PATH` 的不同格式间转换。

`addsuffix (+)`：若设置，文件名补全在目录匹配时末尾添加 `/`，普通文件匹配时添加空格。默认设置。

`afsuser (+)`：若设置，`autologout` 的自动锁定功能使用其值而非本地用户名进行 kerberos 认证。

`ampm (+)`：若设置，所有时间以 12 小时 AM/PM 格式显示。

`anyerror (+)`：此变量选择什么传播到 `status` 变量的值。更多信息见下文 `status` 变量描述。

`argv`：shell 的参数。位置参数取自 `argv`，即 `$1` 被替换为 `$argv[1]` 等。默认设置，但在交互式 shell 中通常为空。

`autocorrect (+)`：若设置，`spell-word` 编辑器命令在每次补全尝试前自动调用。

`autoexpand (+)`：若设置，`expand-history` 编辑器命令在每次补全尝试前自动调用。若设为 `onlyhistory`，则仅展开历史，第二次补全展开文件名。

`autolist (+)`：若设置，歧义补全后列出可能性。若设为 `ambiguous`，仅在补全未添加新字符时列出可能性。

`autologout (+)`：第一个单词是不活动到自动注销的分钟数。可选的第二个单词是不活动到自动锁定的分钟数。当 shell 自动注销时，打印 `auto-logout`，将 `logout` 变量设为 `automatic` 并退出。当 shell 自动锁定时，要求用户输入密码以继续工作。五次错误尝试导致自动注销。登录和超级用户 shell 中默认设为 `60`（60 分钟后自动注销，不锁定），但若 shell 认为在窗口系统下运行（即设置了 `DISPLAY` 环境变量）、tty 是伪终端（pty）或 shell 未如此编译（参见 `version` shell 变量）则不如此。取消设置或设为 `0` 禁用自动注销。另见 `afsuser` 和 `logout` shell 变量。

`autorehash (+)`：若设置，若命令在哈希表中未找到，则重新计算 `path` 变量中目录内容的内部哈希表。此外，若设为 `complete` 或 `correct`，则分别为每次命令补全或拼写校正尝试重建可用命令列表；若设为 `always`，两种情况都执行。

`backslash_quote (+)`：若设置，反斜杠（`\`）始终引用 `\`、`'` 和 `"`。这可使复杂引用任务更容易，但可能在 `csh(1)` 脚本中导致语法错误。

`catalog`：消息目录的文件名。若设置，tcsh 使用 `tcsh.${catalog}` 作为消息目录而非默认的 `tcsh`。

`cdpath`：`cd` 应在当前目录中找不到子目录时搜索的目录列表。

`cdtohome (+)`：若未设置，`cd` 需要目录 `name`，省略时不会到 `home` 目录。默认设置。

`color`：若设置，为内建 `ls-F` 启用彩色显示，并向 `ls` 传递 `--color=auto`。也可设为仅 `ls-F` 或仅 `ls` 以仅对其中一个命令启用颜色。设为空值等价于设为 `(ls-F ls)`。

`colorcat`：若设置，为 NLS 消息文件启用颜色转义序列，并显示彩色 NLS 消息。

`command (+)`：若设置，是通过 `-c` 标志传递给 shell 的命令（参见下文）。

`compat_expr (+)`：若设置，shell 从右到左求值表达式，与原始 `csh` 一致。

`complete (+)`：若设为 `igncase`，补全不区分大小写。若设为 `enhance`，补全忽略大小写并将连字符与下划线视为等价；同时将句点、连字符和下划线（`.`、`-` 和 `_`）视为单词分隔符。若设为 `Enhance`，补全显式匹配大写字母和下划线字符，并以不区分大小写的方式匹配小写字母和连字符；将句点、连字符和下划线视为单词分隔符。

`continue (+)`：若设为命令列表，shell 将继续列出的命令，而非启动新命令。

`continue_args (+)`：与 `continue` 相同，但 shell 执行：

```sh
echo `pwd` $argv > ~/.<cmd>_pause; %<cmd>
```

`correct (+)`：若设为 `cmd`，命令自动拼写校正。若设为 `complete`，命令自动补全。若设为 `all`，校正整个命令行。

`csubstnonl (+)`：若设置，命令替换中的换行符和回车符替换为空格。默认设置。

`cwd`：当前目录的完整路径名。另见 `dirstack` 和 `owd` shell 变量。

`dextract (+)`：若设置，`pushd +n` 从目录栈中提取第 n 个目录，而非将其旋转到栈顶。

`dirsfile (+)`：`dirs -S` 和 `dirs -L` 查找历史文件的默认位置。若未设置，使用 `~/.cshdirs`。因为通常只有 `~/.tcshrc` 在 `~/.cshdirs` 之前被加载，所以 `dirsfile` 应在 `~/.tcshrc` 而非 `~/.login` 中设置。

`dirstack (+)`：目录栈上所有目录的数组。`$dirstack[1]` 是当前工作目录，`$dirstack[2]` 是栈中第一个目录，依此类推。注意当前工作目录是 `$dirstack[1]` 但在目录栈替换中等价为 `=0`。可以通过设置 `dirstack` 任意更改栈，但第一个元素（当前工作目录）始终正确。另见 `cwd` 和 `owd` shell 变量。

`dspmbyte (+)`：仅当 `dspm` 列为 `version` shell 变量的一部分时生效。若设为 `euc`，启用 EUC-kanji（日文）代码的显示和编辑。若设为 `sjis`，启用 Shift-JIS（日文）代码的显示和编辑。若设为 `big5`，启用 Big5（中文）代码的显示和编辑。若设为 `utf8`，启用 Utf8（Unicode）代码的显示和编辑。若设为以下格式，则启用原始多字节代码格式的显示和编辑：

```sh
> set dspmbyte = 0000....(256 bytes)....0000
```

该表恰好需要 256 字节。256 个字符中的每一个（从左到右）对应 ASCII 码 0x00、0x01、……、0xff。每个字符设为数字 0、1、2 或 3。每个数字含义如下：

* `0` …… 不用于多字节字符。
* `1` …… 用于多字节字符的首字节。
* `2` …… 用于多字节字符的第二字节。
* `3` …… 用于多字节字符的首字节和第二字节。

  示例：

若设为 `001322`，第一个字符（即 ASCII 码 0x00）和第二个字符（即 ASCII 码 0x01）设为 `0`，不用于多字节字符。第 3 个字符（0x02）设为 `1`，表示用于多字节字符的首字节。第 4 个字符（0x03）设为 `3`，用于多字节字符的首字节和第二字节。第 5 和第 6 个字符（0x04、0x05）设为 `2`，表示用于多字节字符的第二字节。

GNU fileutils 版本的 `ls` 若无 `-N`（`--literal`）选项则无法显示多字节文件名。若使用此版本，将 `dspmbyte` 的第二个单词设为 `ls`。否则，例如 `ls-F -l` 无法显示多字节文件名。

注意：

此变量仅在编译时定义了 `KANJI` 和 `DSPMBYTE` 时可用。

`dunique (+)`：若设置，`pushd` 在将 `name` 压入栈前先从栈中移除所有 `name` 实例。

`echo`：若设置，每条命令及其参数在执行前立即回显。对于非内建命令，所有展开在回显前发生。内建命令在命令和文件名替换前回显，因为这些替换是有选择地进行的。由 `-x` 命令行选项设置。

`echo_style (+)`：`echo` 内建的风格。可设为：

* `bsd`：若第一个参数是 `-n` 则不回显换行符；`csh` 的默认值。
* `sysv`：识别 `echo` 字符串中的反斜杠转义序列。
* `both`：同时识别 `-n` 标志和反斜杠转义序列；`tcsh` 的默认值。
* `none`：均不识别。

默认设为本地系统默认值。BSD 和 System V 选项在相应系统的 `echo(1)` 手册页中描述。

`edit (+)`：若设置，使用命令行编辑器。交互式 shell 中默认设置。

`editors (+)`：`run-fg-editor` 编辑器命令匹配的命令名列表。若未设置，改用 `EDITOR`（未设置则为 `ed`）和 `VISUAL`（未设置则为 `vi`）环境变量。

`ellipsis (+)`：若设置，`%c`/`%.` 和 `%C` 提示序列（参见 `prompt` shell 变量）以省略号（`...`）而非 `/<skipped>` 表示被跳过的目录。

`euid (+)`：用户的有效用户 ID。

`euser (+)`：与有效用户 ID 对应的第一个匹配的 passwd 条目名。

`fignore (+)`：列出补全应忽略的文件名后缀。

`filec`：在 `tcsh` 中，始终使用补全，此变量默认被忽略。若未设置 `edit`，则使用传统的 `csh` 补全。若在 `csh` 中设置，使用文件名补全。

`gid (+)`：用户的实际组 ID。

`globdot (+)`：若设置，通配符 glob 模式将匹配以 `.` 开头的文件和目录（除 `.` 和 `..` 外）。

`globstar (+)`：若设置，`**` 和 `***` 文件 glob 模式将匹配包含 `/` 的任意字符串，遍历任何现有子目录。（例如 `ls **.c` 将列出当前目录树中所有 `.c` 文件。）若单独使用，匹配零个或多个子目录（例如 `ls /usr/include/**/time.h` 将列出 `/usr/include` 目录树中任何名为 `time.h` 的文件；而 `ls /usr/include/**time.h` 将匹配 `/usr/include` 目录树中以 `time.h` 结尾的任何文件）。为防止递归问题，`**` glob 模式不会进入包含目录的符号链接。要覆盖此行为，使用 `***`。

`group (+)`：用户的组名。

`highlight`：若设置，增量搜索匹配（`i-search-back` 和 `i-search-fwd` 中）以及标记和光标之间的区域以反视频高亮显示。

高亮需要更频繁的终端写入，引入额外开销。若关心终端性能，可能希望保持未设置。

`histchars`：决定 `历史替换`（参见下文）中所用字符的字符串值。其值的第一个字符用作历史替换字符，替换默认字符 `!`。其值的第二个字符替换快速替换中的字符 `^`。

`histdup (+)`：控制历史列表中重复条目的处理。若设为 `all`，仅唯一历史事件进入历史列表。若设为 `prev` 且上一个历史事件与当前命令相同，则当前命令不进入历史。若设为 `erase` 且在历史列表中找到相同事件，则删除旧事件并插入当前事件。注意 `prev` 和 `all` 选项重新编号历史事件以避免间隔。

`histfile (+)`：`history -S` 和 `history -L` 查找历史文件的默认位置。若未设置，使用 `~/.history`。`histfile` 在不同机器间共享同一主目录或在不同终端上保存独立历史时很有用。因为通常只有 `~/.tcshrc` 在 `~/.history` 之前被加载，所以 `histfile` 应在 `~/.tcshrc` 而非 `~/.login` 中设置。

`histlit (+)`：若设置，内建和编辑器命令以及 `savehist` 机制使用历史列表中行的字面（未展开）形式。另见 `toggle-literal-history` 编辑器命令。

`history`：第一个单词指示要保存的历史事件数。可选的第二个单词（+）指示打印历史的格式；若未给出，使用 `%h\t%T\t%R\n`。格式序列在下文 `prompt` 下描述；注意 `%R` 的可变含义。默认设为 `100`。

`home`：初始化为调用者的主目录。`~` 的文件名展开引用此变量。

`ignoreeof`：若设为空字符串或 `0` 且输入设备是终端，`end-of-file` 命令（通常由用户在空行键入 `^D` 生成）使 shell 打印 `Use "exit" to leave tcsh.` 而非退出。这防止 shell 被意外杀死。历史上此设置在 26 次连续 EOF 后退出以避免无限循环。若设为数字 `n`，shell 忽略 `n - 1` 次连续 `end-of-file` 并在第 `n` 次退出。（+）若未设置，使用 `1`，即 shell 在单次 `^D` 时退出。

`implicitcd (+)`：若设置，shell 将键入作为命令的目录名视为切换到该目录的请求。若设为 `verbose`，目录切换回显到标准输出。此行为在非交互式 shell 脚本中或对多于一个单词的命令字符串被抑制。切换目录优先于执行同名命令，但在别名替换之后进行。波浪号和变量展开按预期工作。

`inputmode (+)`：若设为 `insert` 或 `overwrite`，在每行开头将编辑器置于该输入模式。

`killdup (+)`：控制 kill 环中重复条目的处理。若设为 `all`，仅唯一字符串进入 kill 环。若设为 `prev` 且上一个被杀死的字符串与当前被杀死的字符串相同，则当前字符串不进入环。若设为 `erase` 且在 kill 环中找到相同字符串，则删除旧字符串并插入当前字符串。

`killring (+)`：指示在内存中保留的被杀死字符串数。默认设为 `30`。若未设置或设为小于 `2`，shell 仅保留最近被杀死的字符串。

字符串由删除（杀死）文本字符串的编辑器命令放入 killring，例如 `backward-delete-word`、`kill-line` 等，以及 `copy-region-as-kill` 命令。`yank` 编辑器命令将最近被杀死的字符串拉入命令行，而 `yank-pop`（参见 `编辑器命令`）可用于拉入较早被杀死的字符串。

`listflags (+)`：若设为 `x`、`a` 或 `A` 或其任意组合（例如 `xA`），它们作为 `ls-F` 的标志使用，使其行为像 `ls -xF`、`ls -Fa`、`ls -FA` 或组合（例如 `ls -FxA`）：`a` 显示所有文件（即使以 `.` 开头），`A` 显示除 `.` 和 `..` 外的所有文件，`x` 横向排序而非纵向。若 `listflags` 的第二个单词被设置，则用作 `ls(1)` 的路径。

`listjobs (+)`：若设置，作业挂起时列出所有作业。若设为 `long`，以长格式列出。

`listlinks (+)`：若设置，`ls-F` 内建命令显示每个符号链接指向的文件类型。

`listmax (+)`：`list-choices` 编辑器命令在不先询问的情况下列出的最大项数。

`listmaxrows (+)`：`list-choices` 编辑器命令在不先询问的情况下列出的最大项行数。

`loginsh (+)`：若是登录 shell 则由 shell 设置。在 shell 中设置或取消设置无效。另见 `shlvl`。

`logout (+)`：shell 在正常注销前设为 `normal`，自动注销前设为 `automatic`，若 shell 被挂起信号杀死则设为 `hangup`（参见 `信号处理`）。另见 `autologout` shell 变量。

`mail`：要检查传入邮件的文件和目录列表，可选前置数字单词。每次提示前，若距上次检查已过 10 分钟，shell 检查每个文件，若文件大小大于零且修改时间大于访问时间，则说 `You have new mail.`（或若 `mail` 包含多个文件，则 `You have new mail in name.`）。

若是登录 shell，则不报告任何邮件文件，除非它在 shell 启动后被修改过，以防止冗余通知。大多数登录程序在登录时会告诉你是否有邮件。

若 `mail` 中指定的文件是目录，shell 将该目录中的每个文件计为单独邮件，并酌情报告 `You have n mails.` 或 `You have n mails in name.`。此功能主要面向以这种方式存储邮件的系统，如 Andrew Mail System。

若 `mail` 的第一个单词是数字，则作为不同的邮件检查间隔（秒）。

极少数情况下，shell 可能报告 `You have mail.` 而非 `You have new mail.`

`matchbeep (+)`：若设为 `never`，补全永不蜂鸣。若设为 `nomatch`，仅无匹配时蜂鸣。若设为 `ambiguous`，多个匹配时蜂鸣。若设为 `notunique`，存在一个精确匹配和其他更长匹配时蜂鸣。若未设置，使用 `ambiguous`。

`nobeep (+)`：若设置，完全禁用蜂鸣。另见 `visiblebell`。

`noclobber`：若设置，对输出重定向施加限制以确保文件不被意外销毁，且 `>>` 重定向引用现有文件，如 `输入/输出` 节所述。

`noding`：若设置，禁用 `prompt` 时间说明符中整点变化时打印 `DING!`。

`noglob`：若设置，`文件名替换` 和 `目录栈替换`（参见下文）被抑制。这在处理文件名的 shell 脚本中或获取文件名列表后不希望进一步展开时最有用。

`nokanji (+)`：若设置且 shell 支持 Kanji（参见 `version` shell 变量），则禁用 Kanji 以使 meta 键可用。

`nonomatch`：若设置，不匹配任何现有文件的 `文件名替换` 或 `目录栈替换`（参见下文）保持不变而非导致错误。格式错误的替换仍是错误，例如 `echo [` 仍会报错。

`nostat (+)`：在补全操作期间不应 `stat(2)` 的目录列表（或匹配目录的 glob 模式；参见 `文件名替换`）。通常用于排除 `stat(2)` 耗时过长的目录，例如 `/afs`。

`notify`：若设置，shell 异步宣布作业完成。默认是在打印提示前呈现作业完成。

`oid (+)`：用户的实际组织 ID。（仅 Domain/OS）

`owd (+)`：旧工作目录，等价于 `cd` 和 `pushd` 使用的 `-`。另见 `cwd` 和 `dirstack` shell 变量。

`padhour`：若设置，启用在 24 和 12 小时格式中为小时打印填充 `0`。例如：`07:45:42` 对 `7:45:42`。

`parseoctal`：为与旧版本兼容，以 0 开头的数字变量不被解释为八进制。设置此变量启用正确的八进制解析。

`path`：查找可执行命令的目录列表。空单词指定当前目录。若无 `path` 变量，则仅完整路径名会执行。`path` 在启动时由 shell 从 `PATH` 环境变量设置，若 `PATH` 不存在则设为系统相关默认值，类似 `(/usr/local/bin /usr/bsd /bin /usr/bin .)`。shell 可能根据编译方式将 `.` 放在 `path` 的开头或末尾，或完全省略；参见 `version` shell 变量。给定既非 `-c` 也非 `-t` 选项的 shell 在读取 `~/.tcshrc` 后以及每次 `path` 重置时哈希 `path` 中目录的内容。若在 shell 活动时向 `path` 中某目录添加新命令，可能需要执行 `rehash` 让 shell 找到它。

`printexitvalue (+)`：若设置且交互式程序以非零状态退出，shell 打印 `Exit status`。

`prompt`：从终端读取每条命令前打印的字符串。`prompt` 可包含以下任何格式序列（+），它们被替换为给定信息：

* `%/`：当前工作目录。
* `%~`：当前工作目录，但主目录以 `~` 表示，其他用户主目录以 `~user` 表示，按 `文件名替换`。`~user` 替换仅在 shell 在当前会话中已在路径名中使用 `~user` 时发生。
* `%c[[0]n]`、`%.[[0]n]`：当前工作目录的尾部组件，或若给出数字 `n` 则为 `n` 个尾部组件。若 `n` 以 `0` 开头，被跳过的组件数以 `/<skipped>trailing` 格式前置于尾部组件前。若 `ellipsis` shell 变量设置，被跳过的组件以省略号表示，整体变为 `...trailing`。`~` 替换如上 `%~` 进行，但计数尾部组件时忽略 `~` 组件。
* `%C`：类似 `%c`，但无 `~` 替换。
* `%h`、`%!`、`!`：当前历史事件号。
* `%M`：完整主机名。
* `%m`：截至第一个 `.` 的主机名。
* `%S`（`%s`）：开始（停止）standout 模式。
* `%B`（`%b`）：开始（停止）加粗模式。
* `%U`（`%u`）：开始（停止）下划线模式。
* `%t`、`%@`：12 小时 AM/PM 格式的时间。
* `%T`：类似 `%t`，但 24 小时格式（但参见 `ampm` shell 变量）。
* `%p`：12 小时 AM/PM 格式的“精确”时间，带秒。
* `%P`：类似 `%p`，但 24 小时格式（但参见 `ampm` shell 变量）。
* `\c`：`c` 按 `bindkey` 解析。
* `^c`：`c` 按 `bindkey` 解析。
* `%%`：单个 `%`。
* `%n`：用户名。
* `%N`：有效用户名。
* `%j`：作业数。
* `%d`：`Day` 格式的星期。
* `%D`：`dd` 格式的日。
* `%w`：`Mon` 格式的月。
* `%W`：`mm` 格式的月。
* `%y`：`yy` 格式的年。
* `%Y`：`yyyy` 格式的年。
* `%l`：shell 的 tty。
* `%L`：清除从提示末尾到显示末尾或行末尾。
* `%$`：展开紧随 `$` 之后的 shell 或环境变量名。
* `%#`：普通用户为 `>`（或 `promptchars` shell 变量的第一个字符），超级用户为 `#`（或 `promptchars` 的第二个字符）。
* `%{string%}`：将 `string` 作为字面转义序列包含。应仅用于更改终端属性，不应移动光标位置。这不能是 `prompt` 中的最后一个序列。
* `%?`：提示前执行的命令的返回码。
* `%R`：在 `prompt2` 中为解析器状态；在 `prompt3` 中为校正后的字符串；在 `history` 中为历史字符串。

`%B`、`%S`、`%U` 和 `%{string%}` 仅在八位干净的 shell 中可用；参见 `version` shell 变量。

加粗、standout 和下划线序列常用于区分超级用户 shell。例如，

```sh
> set prompt = "%m [%h] %B[%@]%b [%/] you rang? "
tut [37] [2:54pm] [/usr/accts/sys] you rang? _
```

若使用 `%t`、`%@`、`%T`、`%p` 或 `%P`，且未设置 `noding`，则在整点变化时（即 `:00` 分钟）打印 `DING!` 而非实际时间。

交互式 shell 中默认设为 `%#` 。

`prompt2 (+)`：`while` 和 `foreach` 循环中以及以 `\` 结尾的行后用于提示的字符串。可使用与 `prompt` 相同的格式序列（参见下文）；注意 `%R` 的可变含义。交互式 shell 中默认设为 `%R?` 。

`prompt3 (+)`：确认自动拼写校正时用于提示的字符串。可使用与 `prompt` 相同的格式序列（参见下文）；注意 `%R` 的可变含义。交互式 shell 中默认设为 `CORRECT>%R (y|n|e|a)?` 。

`promptchars (+)`：若设置（为两字符字符串），`prompt` shell 变量中的 `%#` 格式序列对普通用户替换为第一个字符，对超级用户替换为第二个字符。

`pushdtohome (+)`：若设置，无参数的 `pushd` 执行 `pushd ~`，类似 `cd`。

`pushdsilent (+)`：若设置，`pushd` 和 `popd` 不打印目录栈。

`recexact (+)`：若设置，即使可能有更长匹配，补全也按精确匹配完成。

`recognize_only_executables (+)`：若设置，命令列表仅显示路径中可执行的文件。较慢。

`rmstar (+)`：若设置，执行 `rm *` 前提示用户。

`rprompt (+)`：提示显示在左侧时在屏幕右侧（命令输入后）打印的字符串。识别与 `prompt` 相同的格式字符。它会根据需要自动消失和重新出现，以确保命令输入不被遮挡，且仅在提示、命令输入和自身能共同适应第一行时才出现。若未设置 `edit`，则 `rprompt` 在提示之后、命令输入之前打印。

`savedirs (+)`：若设置，shell 在退出前执行 `dirs -S`。若第一个单词设为数字，最多保存那么多目录栈条目。

`savehist`：若设置，shell 在退出前执行 `history -S`。若第一个单词设为数字，最多保存那么多行。（该数字应小于或等于 `history` 条目数；若设为大于 `history` 设置的数，仅保存 `history` 条目。）若第二个单词设为 `merge`，历史列表与现有历史文件合并而非替换（若存在），并按时间戳排序，保留最新事件。若 `savehist` 的第二个单词是 `merge` 且第三个单词设为 `lock`，则历史文件更新与其他可能希望同时合并历史的 shell 会话串行化。（+）

`sched (+)`：`sched` 内建命令打印计划事件的格式；若未给出，使用 `%h\t%T\t%R\n`。格式序列在上文 `prompt` 下描述；注意 `%R` 的可变含义。

`shell`：shell 所在文件。用于派生 shell 解释设置了执行位但系统无法执行的文件。（参见 `内建和非内建命令执行` 的描述。）初始化为 shell 的（系统相关）主目录。

`shlvl (+)`：嵌套 shell 数。登录 shell 中重置为 1。另见 `loginsh`。

`status`：上一条命令或反引号展开的退出状态，或管道中任何命令的状态传播到 `status`。（这也是默认的 `csh` 行为。）此默认不匹配 POSIX 要求（仅返回最后一条命令的状态）。要匹配 POSIX 行为，需取消设置 `anyerror`。

若 `anyerror` 变量未设置，管道的退出状态仅由管道中最后一条命令决定，且反引号展开的退出状态**不**传播到 `status`。

若命令异常终止，状态加 0200。失败的内建命令返回退出状态 `1`，所有其他内建命令返回状态 `0`。

`symlinks (+)`：可设为几个不同值以控制符号链接（`symlink`）解析：

若设为 `chase`，每当当前目录更改为包含符号链接的目录时，展开为链接指向目录的真实名称。这对用户主目录不起作用；这是一个 bug。

若设为 `ignore`，shell 尝试构造相对于链接被跨越前当前目录的当前目录。这意味着通过符号链接 `cd` 然后 `cd ..` 返回原始目录。这仅影响内建命令和文件名补全。

若设为 `expand`，shell 尝试通过实际展开看起来像路径名的参数来修复符号链接。这影响任何命令，不仅是内建命令。不幸的是，这对难以识别的文件名（如嵌入命令选项中的文件名）不起作用。可通过引用阻止展开。虽然此设置通常最方便，但有时会误导，有时在无法识别应展开的参数时令人困惑。折衷方案是使用 `ignore` 并在必要时使用 `normalize-path` 编辑器命令（默认绑定到 `^X-n`）。

举几个例子。首先，建立一些示例目录：

```sh
> cd /tmp
> mkdir from from/src to
> ln -s from/src to/dst
```

`symlinks` 未设置时的行为：

```sh
> cd /tmp/to/dst; echo $cwd
/tmp/to/dst
> cd ..; echo $cwd
/tmp/from
```

`symlinks` 设为 `chase` 时的行为：

```sh
> cd /tmp/to/dst; echo $cwd
/tmp/from/src
> cd ..; echo $cwd
/tmp/from
```

`symlinks` 设为 `ignore` 时的行为：

```sh
> cd /tmp/to/dst; echo $cwd
/tmp/to/dst
> cd ..; echo $cwd
/tmp/to
```

`symlinks` 设为 `expand` 时的行为：

```sh
> cd /tmp/to/dst; echo $cwd
/tmp/to/dst
> cd ..; echo $cwd
/tmp/to
> cd /tmp/to/dst; echo $cwd
/tmp/to/dst
> cd ".."; echo $cwd
/tmp/from
> /bin/echo ..
/tmp/to
> /bin/echo ".."
..
```

注意 `expand` 展开 1）对 `cd` 等内建命令的工作方式与 `ignore` 相同，2）通过引用阻止，3）在文件名传递给非内建命令前发生。

`tcsh (+)`：shell 的版本号，格式为 `R.VV.PP`，其中 `R` 是主版本号，`VV` 是当前版本，`PP` 是补丁级别。

`term`：终端类型。通常在 `~/.login` 中设置，如 `启动与关闭` 下所述。

`time`：若设为数字，则 `time` 内建（参见下文）在每条耗时超过该 CPU 秒数的命令后自动执行。若有第二个单词，它用作 `time` 内建输出的格式字符串。（u）格式字符串中可使用以下序列：

* `%U`：进程在用户模式花费的 CPU 秒数。
* `%S`：进程在内核模式花费的 CPU 秒数。
* `%E`：经过的（墙上时钟）时间（秒）。
* `%P`：CPU 百分比，计算为 `(%U + %S) / %E`。
* `%W`：进程被交换的次数。
* `%X`：使用的（共享）文本空间平均量（KB）。
* `%D`：使用的（非共享）数据/栈空间平均量（KB）。
* `%K`：使用的总空间（`%X + %D`）（KB）。
* `%M`：进程在任意时刻使用的最大内存（KB）。
* `%F`：主要页错误数（需要从磁盘调入的页）。
* `%R`：次要页错误数。
* `%I`：输入操作数。
* `%O`：输出操作数。
* `%r`：接收的套接字消息数。
* `%s`：发送的套接字消息数。
* `%k`：接收的信号数。
* `%w`：自愿上下文切换数（等待）。
* `%c`：非自愿上下文切换数。

无 BSD 资源限制功能的系统仅支持前四个序列。默认时间格式为支持资源使用报告的系统的 `%Uu %Ss %E %P %X+%Dk %I+%Oio %Fpf+%Ww` 和不支持系统的 `%Uu %Ss %E %P`。

在 Sequent DYNIX/ptx 下，`%X`、`%D`、`%K`、`%r` 和 `%s` 不可用，但有以下额外序列：

* `%Y`：执行的系统调用数。
* `%Z`：按需零填充的页数。
* `%i`：进程驻留集大小被内核增加的次数。
* `%d`：进程驻留集大小被内核减少的次数。
* `%l`：执行的读取系统调用数。
* `%m`：执行的写入系统调用数。
* `%p`：从原始磁盘设备读取的次数。
* `%q`：向原始磁盘设备写入的次数。

默认时间格式为 `%Uu %Ss %E %P %I+%Oio %Fpf+%Ww`。注意多处理器上 CPU 百分比可能超过 100%。

`tperiod (+)`：`periodic` 特殊别名执行之间的间隔（分钟）。

`tty (+)`：tty 的名称，若未附加则为空。

`uid (+)`：用户的实际用户 ID。

`user`：用户的登录名。

`verbose`：若设置，导致每条命令的单词在历史替换（若有）后打印。由 `-v` 命令行选项设置。

`version (+)`：版本 ID 戳。它包含 shell 的版本号（参见 `tcsh`）、来源、发布日期、供应商、操作系统和机器（参见 `VENDOR`、`OSTYPE` 和 `MACHTYPE`）以及编译时设置的以逗号分隔的选项列表。发行版中默认设置的选项有标注。

* `8b`：shell 是八位干净的；默认。
* `7b`：shell 不是八位干净的。
* `wide`：shell 是多字节编码干净的（如 UTF-8）。
* `nls`：使用系统 NLS；有 NLS 系统的默认。
* `lf`：登录 shell 在 `~/.tcshrc` 和 `~/.history` **之前**而非之后执行 `~/.login`。
* `dl`：`path` 中 `.` 放在最后以保安全；默认。
* `nd`：为安全从 `path` 中省略 `.`。
* `vi`：默认使用 `vi(1)` 风格编辑而非 `emacs(1)` 风格。
* `dtr`：登录 shell 退出时丢弃 DTR。
* `bye`：`bye` 是 `logout` 的同义词，`log` 是 `watchlog` 的别名。
* `al`：启用 `autologout`；默认。
* `kan`：根据区域设置在适当时使用 Kanji，除非设置了 `nokanji` shell 变量。
* `sm`：使用系统的 `malloc(3)`。
* `hb`：执行 shell 脚本时模拟 `#!<program> <args>` 约定。
* `ng`：`newgrp` 内建可用。
* `rh`：shell 尝试设置 `REMOTEHOST` 环境变量。
* `afs`：若本地认证失败，shell 用 kerberos 服务器验证你的密码。`afsuser` shell 变量或 `AFSUSER` 环境变量覆盖你的本地用户名（若设置）。

管理员可输入额外字符串以指示本地版本的差异。

`vimode (+)`：若未设置，各种键绑定行为更接近 `emacs(1)` 风格：单词边界由 `wordchars` 与其他字符决定。若设置，各种键绑定行为更接近 `vi(1)` 风格：单词边界由 `wordchars` 与空白与其他字符决定；光标行为取决于当前 vi 模式（命令、删除、插入、替换）。此变量由 `bindkey -e` 取消设置，由 `bindkey -v` 设置。若需要，用户可在这些 `bindkey` 操作后显式设置或取消设置 `vimode`。

`visiblebell (+)`：若设置，使用屏幕闪烁而非可听蜂鸣。另见 `nobeep`。

`watch (+)`：监视登录和注销的用户/终端对列表。若用户为 `any`，则监视该用户的所有终端，反之亦然。将 `watch` 设为 `(any any)` 监视所有用户和终端。例如，

```sh
set watch = (george ttyd1 any console $user any)
```

报告用户 `george` 在 ttyd1 上的活动、控制台上的任何用户以及任何终端上的自己（或入侵者）。

登录和注销默认每 10 分钟检查一次，但 `watch` 的第一个单词可设为数字以指定检查间隔分钟数。例如，

```sh
set watch = (1 any any)
```

每分钟报告任何登录/注销一次。对于急性子，`log` 内建命令可在任何时候触发 `watch` 报告。`watch` 首次设置时报告所有当前登录（如同 `log` 内建）。

`who` shell 变量控制 `watch` 报告的格式。

`who (+)`：`watch` 消息的格式字符串。以下序列被替换为给定信息：

* `%n`：登录/注销的用户名。
* `%a`：观察到的动作，即 `logged on`、`logged off` 或 `replaced olduser on`。
* `%l`：用户登录/注销的终端（tty）。
* `%M`：远程主机的完整主机名，若登录/注销来自本地主机则为 `local`。
* `%m`：远程主机截至第一个 `.` 的主机名。若是 IP 地址或 X Window System 显示，则打印完整名称。

`%M` 和 `%m` 仅在 `/etc/utmp` 中存储远程主机名的系统上可用。若未设置，使用 `%n has %a %l from %m.`，或不存储远程主机名的系统上使用 `%n has %a %l.`。

`wordchars (+)`：由 `forward-word`、`backward-word` 等编辑器命令视为单词一部分的非字母数字字符列表。若未设置，默认值根据 `vimode` 状态决定：若 `vimode` 未设置，使用 `*?_\-.[]~=` 作为默认值；若 `vimode` 设置，使用 `_` 作为默认值。

## 环境变量

`AFSUSER (+)`：等价于 `afsuser` shell 变量。

`COLUMNS`：终端的列数。参见 `终端管理`。

`DISPLAY`：由 X Window System 使用（参见 `X(1)`）。若设置，shell 不设置 `autologout`（参见下文）。

`EDITOR`：默认编辑器的路径名。若 `editors` shell 变量未设置，由 `run-fg-editor` 编辑器命令使用。另见 `VISUAL` 环境变量。

`GROUP (+)`：等价于 `group` shell 变量。

`HOME`：等价于 `home` shell 变量。

`HOST (+)`：初始化为运行 shell 的机器名，由 `gethostname(2)` 系统调用确定。

`HOSTTYPE (+)`：初始化为运行 shell 的机器类型，在编译时确定。此变量已过时，将在未来版本中移除。

`HPATH (+)`：冒号分隔的目录列表，`run-help` 编辑器命令在其中查找命令文档。

`LANG`：给出首选字符环境。参见 `本地语言系统支持`。

`LC_CTYPE`：若设置，仅更改 ctype 字符处理。参见 `本地语言系统支持`。

`LINES`：终端的行数。参见 `终端管理`。

`LS_COLORS`：此变量的格式类似于 `termcap(5)` 文件格式；冒号分隔的 `xx=string` 形式表达式列表，其中 `xx` 是两字符变量名。变量及其默认值为：

| 变量   | 默认值   | 含义                  |
| ---- | ----- | ------------------- |
| `no` | 0     | 普通（非文件名）文本          |
| `fi` | 0     | 常规文件                |
| `di` | 01;34 | 目录                  |
| `ln` | 01;36 | 符号链接                |
| `pi` | 33    | 命名管道（FIFO）          |
| `so` | 01;35 | 套接字                 |
| `do` | 01;35 | Door                |
| `bd` | 01;33 | 块设备                 |
| `cd` | 01;32 | 字符设备                |
| `ex` | 01;32 | 可执行文件               |
| `mi` | （无）   | 缺失文件（默认为 `fi`）      |
| `or` | （无）   | 孤立符号链接（默认为 `ln`）    |
| `lc` | ^\[\[ | 左代码                 |
| `rc` | m     | 右代码                 |
| `ec` | （无）   | 结束代码（替换 `lc+no+rc`） |

只需包含要从默认值更改的变量。

文件名也可根据文件名扩展名着色。这在 `LS_COLORS` 变量中使用语法 `*ext=string` 指定。例如，使用 ISO 6429 代码将所有 C 语言源文件着蓝色，指定 `*.c=34`。这会将所有以 `.c` 结尾的文件着为蓝色（34）。

控制字符可用 C 风格转义表示法或 stty 风格的 `^` 表示法书写。C 风格表示法添加 `^[` 表示 Escape、`_` 表示普通空格字符、`?` 表示 Delete。此外，`^[` 转义字符可用于覆盖 `^[`、`^`、`:` 和 `=` 的默认解释。

每个文件将写为 `<lc> <color-code> <rc> <filename> <ec>`。若 `<ec>` 代码未定义，则改用序列 `<lc> <no> <rc>`。这通常更便于使用，但通用性较低。提供左、右和结束代码以免一遍又一遍地输入公共部分，并支持奇怪终端；除非你的终端不使用 ISO 6429 颜色序列而使用不同系统，否则通常完全不需要更改它们。

若你的终端确实使用 ISO 6429 颜色代码，可由分号分隔的数字命令组成类型代码（即除 `lc`、`rc` 和 `ec` 代码外的所有代码）。最常见命令为：

| 代码 | 含义        |
| -- | --------- |
| 0  | 恢复默认颜色    |
| 1  | 更亮的颜色     |
| 4  | 下划线文本     |
| 5  | 闪烁文本      |
| 30 | 黑色前景      |
| 31 | 红色前景      |
| 32 | 绿色前景      |
| 33 | 黄色（或棕色）前景 |
| 34 | 蓝色前景      |
| 35 | 紫色前景      |
| 36 | 青色前景      |
| 37 | 白色（或灰色）前景 |
| 40 | 黑色背景      |
| 41 | 红色背景      |
| 42 | 绿色背景      |
| 43 | 黄色（或棕色）背景 |
| 44 | 蓝色背景      |
| 45 | 紫色背景      |
| 46 | 青色背景      |
| 47 | 白色（或灰色）背景 |

并非所有命令在所有系统或显示设备上有效。

少数终端程序不能正确识别默认结束代码。若执行目录列表后所有文本都被着色，尝试将 `no` 和 `fi` 代码从 0 更改为标准前景和背景颜色的数字代码。

`MACHTYPE (+)`：机器类型（微处理器类别或机器型号），在编译时确定。

`NOREBIND (+)`：若设置，可打印字符不重新绑定到 `self-insert-command`。参见 `本地语言系统支持`。

`OSTYPE (+)`：操作系统，在编译时确定。

`PATH`：冒号分隔的目录列表，在其中查找可执行文件。等价于 `path` shell 变量，但格式不同。

`PWD (+)`：等价于 `cwd` shell 变量，但不同步；仅在实际目录更改后更新。

`REMOTEHOST (+)`：用户远程登录的主机（若是这种情况且 shell 能确定）。仅当 shell 如此编译时设置；参见 `version` shell 变量。

`SHLVL (+)`：等价于 `shlvl` shell 变量。

`SYSTYPE (+)`：当前系统类型。（仅 Domain/OS）

`TERM`：等价于 `term` shell 变量。

`TERMCAP`：终端能力字符串。参见 `终端管理`。

`USER`：等价于 `user` shell 变量。

`VENDOR (+)`：供应商，在编译时确定。

`VISUAL`：默认全屏编辑器的路径名。若 `editors` shell 变量未设置，由 `run-fg-editor` 编辑器命令使用。另见 `EDITOR` 环境变量。

## 文件

**`/etc/csh.cshrc`** 由每个 shell 首先读取。ConvexOS、Stellix 和 Intel 使用 `/etc/cshrc`，NeXTs 使用 `/etc/cshrc.std`。A/UX、AMIX、Cray 和 IRIX 在 `csh(1)` 中无等价物，但 `tcsh` 仍读取此文件。Solaris 2.x 也没有，但 `tcsh` 读取 `/etc/.cshrc`。（+）

**`/etc/csh.login`** 由登录 shell 在 `/etc/csh.cshrc` 之后读取。ConvexOS、Stellix 和 Intel 使用 `/etc/login`，NeXTs 使用 `/etc/login.std`，Solaris 2.x 使用 `/etc/.login`，A/UX、AMIX、Cray 和 IRIX 使用 `/etc/cshrc`。

**`~/.tcshrc`** (+) 由每个 shell 在 `/etc/csh.cshrc` 或其等价物之后读取。

**`~/.cshrc`** 若 `~/.tcshrc` 不存在，由每个 shell 在 `/etc/csh.cshrc` 或其等价物之后读取。本手册中 `~/.tcshrc` 指 `~/.tcshrc` 或若未找到 `~/.tcshrc` 则为 `~/.cshrc`。

**`~/.history`** 若设置了 `savehist`，由登录 shell 在 `~/.tcshrc` 之后读取，但另见 `histfile`。

**`~/.login`** 由登录 shell 在 `~/.tcshrc` 或 `~/.history` 之后读取。shell 可能被编译为在 `~/.tcshrc` 和 `~/.history` 之前而非之后读取 `~/.login`；参见 `version` shell 变量。

**`~/.cshdirs`** (+) 若设置了 `savedirs`，由登录 shell 在 `~/.login` 之后读取，但另见 `dirsfile`。

**`/etc/csh.logout`** 由登录 shell 在注销时读取。ConvexOS、Stellix 和 Intel 使用 `/etc/logout`，NeXTs 使用 `/etc/logout.std`。A/UX、AMIX、Cray 和 IRIX 在 `csh(1)` 中无等价物，但 `tcsh` 仍读取此文件。Solaris 2.x 也没有，但 `tcsh` 读取 `/etc/.logout`。（+）

**`~/.logout`** 由登录 shell 在注销时于 `/etc/csh.logout` 或其等价物之后读取。

**`/bin/sh`** 用于解释不以 `#` 开头的 shell 脚本。

**`/tmp/sh*`** `<<` 的临时文件。

**`/etc/passwd`** `~name` 替换的主目录来源。

启动文件的读取顺序可能因 shell 的编译方式而异；参见 `启动与关闭` 和 `version` shell 变量。

## 新特性 (+)

本手册将 `tcsh` 描述为单一实体，但有经验的 `csh(1)` 用户会希望特别关注 `tcsh` 的新特性。

命令行编辑器，支持 `emacs(1)` 风格或 `vi(1)` 风格键绑定。参见 `命令行编辑器` 和 `编辑器命令`。

可编程的交互式单词补全和列表。参见 `补全与列表` 以及 `complete` 和 `uncomplete` 内建命令。

文件名、命令和变量的 `拼写校正`（参见下文）。

`编辑器命令`（参见下文）在键入命令过程中执行其他有用功能，包括文档查找（`run-help`）、快速编辑器重启（`run-fg-editor`）和命令解析（`which-command`）。

增强的历史机制。历史列表中的事件带有时间戳。另见 `history` 命令及其关联 shell 变量、先前未文档化的 `#` 事件说明符和 `历史替换` 下的新修饰符、`*-history`、`history-search-*`、`i-search-*`、`vi-search-*` 和 `toggle-literal-history` 编辑器命令以及 `histlit` shell 变量。

增强的目录解析和目录栈处理。参见 `cd`、`pushd`、`popd` 和 `dirs` 命令及其关联 shell 变量、`目录栈替换` 的描述、`dirstack`、`owd` 和 `symlinks` shell 变量以及 `normalize-command` 和 `normalize-path` 编辑器命令。

glob 模式中的否定。参见 `文件名替换`。

新的 `文件查询运算符`（参见下文）和使用它们的 `filetest` 内建。

各种 `自动、周期性和定时事件`（参见下文），包括计划事件、特殊别名、自动注销和终端锁定、命令计时以及登录/注销监视。

支持本地语言系统（参见 `本地语言系统支持`）、操作系统变体特性（参见 `操作系统变体支持` 和 `echo_style` shell 变量）以及系统相关文件位置（参见 `文件`）。

广泛的终端管理能力。参见 `终端管理`。

新的内建命令，包括 `builtins`、`hup`、`ls-F`、`newgrp`、`printenv`、`which` 和 `where`（参见下文）。

使有用信息易于供 shell 使用的新变量。参见 `gid`、`loginsh`、`oid`、`shlvl`、`tcsh`、`tty`、`uid` 和 `version` shell 变量以及 `HOST`、`REMOTEHOST`、`VENDOR`、`OSTYPE` 和 `MACHTYPE` 环境变量。

在提示字符串中包含有用信息的新语法（参见 `prompt`），以及用于循环和拼写校正的特殊提示（参见 `prompt2` 和 `prompt3`）。

只读变量。参见 `变量替换`。

## 缺陷

挂起命令重启时，若启动目录与当前目录不同，shell 打印启动目录。这可能具有误导性（即错误），因为作业可能内部更改了目录。

shell 内建函数不可停止/重启。形式为 `a ; b ; c` 的命令序列在尝试停止时也不能优雅处理。若挂起 `b`，shell 将立即执行 `c`。若此展开来自 `alias` 则尤其明显。将命令序列放入 `()` 中强制其到子 shell 即可，即 `( a ; b ; c )`。

进程启动后对 tty 输出的控制是原始的；也许这会激励某人开发好的虚拟终端接口。在虚拟终端接口中，输出控制可以做更多有趣的事情。

别名替换最常用于笨拙地模拟 shell 过程；应提供 shell 过程而非别名。

控制结构应被解析而非被识别为内建命令。这将允许控制命令放置在任何位置，与 `|` 组合，并与 `&` 和 `;` 元语法一起使用。

`foreach` 在查找其 `end` 时不忽略 here 文档。

应能在命令替换的输出上使用 `:` 修饰符。

若终端不能上移光标（即终端类型 `dumb`），超过屏幕宽度的行的屏幕更新非常糟糕。

`HPATH` 和 `NOREBIND` 不需要是环境变量。

不使用 `?`、`*` 或 `[]` 或使用 `{}` 或 `~` 的 glob 模式未正确否定。

`if` 的单命令形式即使表达式为假且命令未执行也执行输出重定向。

`ls-F` 在排序文件名时包含文件识别字符，并不能很好地处理文件名中的控制字符。它不能被中断。

命令替换支持多命令和条件，但不支持循环或向后 `goto`。

在 <https://bugs.astron.com/> 报告 bug，最好附带修复。若你想帮助维护和测试 tcsh，在 <https://mailman.astron.com/> 将自己加入邮件列表。

## TCSH 中的 T

1964 年，DEC 生产了 PDP-6。PDP-10 是后来的重新实现。约 1970 年 DEC 推出第二个型号 KI10 时，它被重新命名为 DECsystem-10。

TENEX 于 1972 年在 Bolt, Beranek & Newman（马萨诸塞州剑桥的一家智库）创建，作为请求分页虚拟内存操作系统的实验。他们为 DEC PDP-10 构建了新的分页器并创建了配套操作系统。它在学术界极为成功。

1975 年，DEC 推出 PDP-10 的新型号 KL10；他们打算只为新机箱提供从 BBN 获得许可的 TENEX 版本。他们称其版本为 TOPS-20（其大写是商标化的）。许多 TOPS-10（`The OPerating System for PDP-10`）用户反对；因此 DEC 发现在同一硬件上支持两个不兼容系统——但 PDP-11 上有 6 个！

TENEX 以及 TOPS-20 到版本 3 通过名为 ULTCMD 的用户代码级子程序库实现命令补全。版本 3 中，DEC 将所有这些能力及更多移入 monitor（`kernel`，对你 Unix 类型而言），由 COMND% JSYS（`Jump to SYStem` 指令，supervisor call 机制 \[我的 IBM 根源也露出来了吗？]）访问。

tcsh 的创建者被此特性以及 TENEX 和 TOPS-20 的其他几个特性所打动，并创建了模仿它们的 csh 版本。

## 限制

系统将参数列表限制为 ARG\_MAX 字符。

涉及文件名展开的命令参数数限制为参数列表允许字符数的 1/6。

命令替换可替换的字符数不超过参数列表允许的字符数。

为检测循环，shell 将单行上的 `alias` 替换数限制为 20。

## 参见

[csh(1)](/man1/csh.1.md), emacs(1), [ls(1)](/man1/ls.1.md), newgrp(1), [sh(1)](/man1/sh.1.md), setpath(1), stty(1), [su(1)](/man1/su.1.md), tset(1), [vi(1)](/man1/vi.1.md), x(1), [access(2)](/sys/access.2.md), [execve(2)](/sys/execve.2.md), [fork(2)](/sys/fork.2.md), [killpg(2)](/compat-43/killpg.2.md), [pipe(2)](/sys/pipe.2.md), setrlimit(2), [sigvec(2)](/compat-43/sigvec.2.md), [stat(2)](/sys/stat.2.md), [umask(2)](/sys/umask.2.md), [vfork(2)](/sys/vfork.2.md), [wait(2)](/sys/wait.2.md), malloc(3), [setlocale(3)](/locale/setlocale.3.md), [tty(4)](/man4/tty.4.md), [a.out(5)](/man5/a.out.5.md), termcap(5), [environ(7)](/man7/environ.7.md), termio(7), Introduction to the C Shell

## 版本

本手册记录 tcsh 6.22.04 (Astron) 2021-04-26。

## 作者

* **William Joy** — `csh(1)` 的原作者
* **J.E. Kulp, IIASA, Laxenburg, Austria** — 作业控制和目录栈特性
* **Ken Greer, HP Labs, 1981** — 文件名补全
* **Mike Ellis, Fairchild, 1983** — 命令名识别/补全
* **Paul Placeway, Ohio State CIS Dept., 1983-1993** — 命令行编辑器、提示例程、新 glob 语法及众多修复和加速
* **Karl Kleinpaste, CCI 1983-4** — 特殊别名、目录栈提取内容、登录/注销监视、计划事件和新提示格式思路
* **Rayan Zachariassen, University of Toronto, 1984** — `ls-F` 和 `which` 内建及众多 bug 修复、修改和加速
* **Chris Kingsley, Caltech** — 快速存储分配例程
* **Chris Grevstad, TRW, 1987** — 将 4.3BSD `csh` 并入 `tcsh`
* **Christos S. Zoulas, Cornell U. EE Dept., 1987-94** — 移植到 HPUX、SVR2 和 SVR3，SysV 版 getwd.c，SHORT\_STRINGS 支持和新版 sh.glob.c
* **James J Dempsey, BBN, and Paul Placeway, OSU, 1988** — A/UX 移植
* **Daniel Long, NNSC, 1988** — `wordchars`
* **Patrick Wolfe, Kuck and Associates, Inc., 1988** — `vi` 模式清理
* **David C Lawrence, Rensselaer Polytechnic Institute, 1989** — `autolist` 和歧义补全列表
* **Alec Wolman, DEC, 1989** — 提示中的换行符
* **Matt Landau, BBN, 1989** — `~/.tcshrc`
* **Ray Moody, Purdue Physics, 1989** — 魔术空格键历史展开
* **Mordechai ????, Intel, 1989** — printprompt() 修复和补充
* **Kazuhiro Honda, Dept. of Computer Science, Keio University, 1989** — 自动拼写校正和 `prompt3`
* **Per Hedeland, Ellemtel, Sweden, 1990-** — 各种 bug 修复、改进和手册更新
* **Hans J. Albertsson (Sun Sweden)** — `ampm`、`settc` 和 `telltc`
* **Michael Bloom** — 中断处理修复
* **Michael Fine, Digital Equipment Corp** — 扩展键支持
* **Eric Schnoebelen, Convex, 1990** — Convex 支持、大量 `csh` bug 修复、目录栈保存和恢复
* **Ron Flax, Apple, 1990** — A/UX 2.0（重新）移植
* **Dan Oscarsson, LTH Sweden, 1990** — NLS 支持和为非 NLS 站点的模拟 NLS 支持、修复
* **Johan Widen, SICS Sweden, 1990** — `shlvl`、Mach 支持、`correct-line`、8 位打印
* **Matt Day, Sanyo Icon, 1990** — POSIX termio 支持、SysV 限制修复
* **Jaap Vermeulen, Sequent, 1990-91** — Vi 模式修复、expand-line、窗口更改修复、Symmetry 移植
* **Martin Boyer, Institut de recherche d'Hydro-Quebec, 1991** — `autolist` 蜂鸣选项、修改历史搜索以搜索从行首到光标的整个字符串
* **Scott Krotz, Motorola, 1991** — Minix 移植
* **David Dawes, Sydney U. Australia, Physics Dept., 1991** — SVR4 作业控制修复
* **Jose Sousa, Interactive Systems Corp., 1991** — 扩展 `vi` 修复和 `vi` 删除命令
* **Marc Horowitz, MIT, 1991** — ANSIfication 修复、新 exec 哈希代码、imake 修复、`where`
* **Bruce Sterling Woodcock, <sterling@netcom.com>, 1991-1995** — ETA 和 Pyramid 移植、Makefile 和 lint 修复、`ignoreeof`=n 添加以及各种其他可移植性更改和 bug 修复
* **Jeff Fink, 1992** — `complete-word-fwd` 和 `complete-word-back`
* **Harry C. Pulley, 1992** — Coherent 移植
* **Andy Phillips, Mullard Space Science Lab U.K., 1992** — VMS-POSIX 移植
* **Beto Appleton, IBM Corp., 1992** — 步进进程组修复、`csh` bug 修复、POSIX 文件测试、POSIX SIGHUP
* **Scott Bolte, Cray Computer Corp., 1992** — CSOS 移植
* **Kaveh R. Ghazi, Rutgers University, 1992** — Tek、m88k、Titan 和 Masscomp 移植和修复。添加 autoconf 支持。
* **Mark Linderman, Cornell University, 1992** — OS/2 移植
* **Mika Liljeberg, <liljeber@kruuna.Helsinki.FI>, 1992** — Linux 移植
* **Tim P. Starrin, NASA Langley Research Center Operations, 1993** — 只读变量
* **Dave Schweisguth, Yale University, 1993-4** — 新手册页和 tcsh.man2html
* **Larry Schwimmer, Stanford University, 1993** — AFS 和 HESIOD 补丁
* **Luke Mewburn, RMIT University, 1994-6** — 提示中的增强目录打印，添加 `ellipsis` 和 `rprompt`。
* **Edward Hutchins, Silicon Graphics Inc., 1996** — 添加隐式 cd。
* **Martin Kraemer, 1997** — 移植到 Siemens Nixdorf EBCDIC 机器
* **Amol Deshpande, Microsoft, 1997** — 移植到 WIN32（Windows/95 和 Windows/NT）；编写所有缺失的库和消息目录代码以与 Windows 接口。
* **Taga Nayuta, 1998** — 彩色 ls 添加。

## 致谢

Bryan Dunlap、Clayton Elwell、Karl Kleinpaste、Bob Manson、Steve Romig、Diana Smetters、Bob Sutterfield、Mark Verber、Elizabeth Zwicky 以及俄亥俄州立大学所有其他人的建议和鼓励。

网络上所有人，忍受、报告 bug 并为每个版本建议新添加。

Richard M. Alderson III，编写 `T in tcsh` 章节。
