手册页部分 1: 用户命令

退出打印视图

更新时间: 2014 年 7 月
 
 

fc(1)

名称

history , fc , hist - 进程命令历史记录列表

用法概要

/usr/bin/fc [-r] [-e editor] [first [last]]
/usr/bin/fc -l [-nr] [first [last]]
/usr/bin/fc -s [old=new] [first]

csh

history [-hr] [n]

ksh88

fc -e - [old=new] [command]
fc -s [old = new] [command]
fc [-e ename] [-nlr] [first [last]]

ksh

hist [-lnprs] [-e editor][-N num][first[last]]

描述

/usr/bin/fc

fc 实用程序用于列出、编辑或重新执行之前输入到交互式 sh 的命令。

命令历史记录列表按编号引用命令。列表中的第一个编号是任意选择的。编号与其对应的命令之间的关系不会发生变化,除非出现用户登录后没有其他进程正在访问列表这一情况,此时系统会重置编号,并使用另一个编号(通常为 1)从保留时间最久的命令开始编号。编号达到 HISTSIZE 中的值或 32767(取两者中的较大者)时,shell 会重新从头编号,使用一个较小的编号(通常为 1)开始对下一个命令进行编号。尽管会使用重新从头编号功能,fc 仍会保留按时间排序的命令顺序。例如,如果为四个连续执行的命令提供了 32 766、32 767、1(重新从头编号)和 2 这四个编号,则 32 767 会被视为 1 之前的命令,尽管它的编号更大。

编辑命令时(未指定 –l 选项时),所得到的行将输入在历史记录列表结尾处,然后由 sh 重新执行。引发编辑的 fc 命令不会输入到历史记录列表中。如果编辑器返回一个非零退出状态,系统会禁止向历史记录列表中输入,还会禁止重新执行命令。与 fc 一起使用的任何命令行变量赋值或重定向运算符都会影响 fc 命令本身以及所产生的命令,例如:

fc -s -- -1 2>/dev/null

会重新调用前一个命令,并且会为 fc 和前一个命令抑制标准错误。

csh

显示历史记录列表。如果指定了 n,则只会显示最近发生的 n 个事件。

–r

将输出顺序反转为最近的事件在前而不是最旧的事件在前。

–h

显示不带前导编号的历史记录列表。这用来生成适合使用 csh 内置命令 source(1)–h 选项来提供信息的文件。

历史记录替换:

历史记录替换允许您在当前正在键入的命令行中使用以前的命令行中的词。这简化了复杂命令或参数的拼写更正和重复输入。命令行保存在历史记录列表中,该列表的大小由 history 变量控制。可以将 history shell 变量设置为历史记录文件中保存的命令行的最大数量,即:

set history = 200

这样,历史记录列表将可以跟踪最近使用的 200 个命令行。如果未设置,则 C shell 将仅保存最近的一个命令。

历史记录替换以 ! 开头(不过可以通过 histchars 变量对此进行更改),可以出现在命令行上的任何位置;历史记录替换不能嵌套。可以使用 \! 进行转义以抑制其特殊含义。

包含历史记录替换的输入行在被展开后会在终端上回显,但该回显发生在任何其他替换发生之前或命令执行之前。

事件定义符:

事件定义符是对历史记录列表中某个命令行条目的引用。

!

启动历史记录替换,除非其后跟有空格字符、tab、换行符、=(

!!

引用前一个命令。单独使用时,此替换重复前一个命令。

!n

引用命令行 n

!–n

引用当前命令行减 n

!str

引用以 str 开头的最近命令。

!?str?

引用包含 str 的最近命令。

!?str? additional

引用包含 str 的最近命令并将 additional 附加到该被引用的命令。

!{command} additional

引用以 command 开头的最近命令并将 additional 附加到该被引用的命令。

^previous_word^replacement^

重复前一个命令行,将字符串 previous_word 替换为字符串 replacement。这等效于以下历史记录替换:

重复前一个命令行,将字符串 previous_word 替换为字符串 replacement。这等效于以下历史记录替换:

!:s/previous_word/replacement/.

要重新执行之前的某个特定命令进行这样的替换,比如说,重复执行命令 #6,请使用以下命令:

!:6s/previous_word/replacement/.
词定义符:

`:'(冒号)将事件指定与词定义符相隔离。如果词定义符以 ^$*% 开头,则可以省略冒号。如果将从前一个命令选择词,则在事件指定中可以忽略第二个 ! 字符。例如,!!:1!:1 都引用前一个命令中的第一个词,而 !!$!$ 都引用前一个命令中的最后一个词。词定义符包括:

#

迄今为止键入的整个命令行。

0

输入的第一个词(命令)。

n

n 个参数。

^

第一个参数,也就是 1

$

最后一个参数。

%

与(最近的)?s 搜索匹配的词。

xy

某一范围内的词;y0−y 的缩写。

*

所有参数,或者一个空值(如果事件中只有一个词)。

x*

x−$ 的缩写。

x

x* 一样,但省略了词 $

修饰符:

在可选的词定义符后,您可以添加包含下列一个或多个修饰符的序列,每个序列前都有一个 :

h

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

r

删除`.xxx' 形式的尾部后缀,保留基名。

e

删除除后缀以外的所有内容,从而保留扩展名。

s/oldchars/replacements/

使用 replacements 替换 oldcharsoldchars 是一个字符串,可以包含嵌入的空格,但事件定义符中的 previous_word 不能包含嵌入的空格。

^oldchars^replacements^
t

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

&

重复前一个替换。

g

向每个词中的匹配项的第一个实例应用更改,向其附加上面的前缀(例如 g&)。

p

输出新命令但不执行它。

q

将替代的词用引号括起来,防止被进一步替换。

x

q 一样,但在每个空格字符、制表符或换行符处拆分为词。

除非前面带有一个 g,否则修改将仅应用于与 oldchars 匹配的第一个字符串。如果没有匹配的字符串,则会产生错误。

左侧的替换项不是正则表达式,而是字符串。任何字符都可以取代 / 用作分隔符。使用反斜杠将分隔符字符括起来。右侧的字符 & 将被来自左侧的文本替换。可以用反斜杠将 & 括起来。空 oldchars 将使用前一个字符串,该字符串来自 oldchars 或者来自 !?s 中的上下文扫描字符串 s。如果一个换行符直接跟在 replacements 之后,则可以省略最右侧的分隔符;类似地,还可以省略上下文扫描中最右侧的 ?

如果没有事件指定,则历史记录引用将引用上一个命令,或者引用命令行上以前的某个历史记录引用(如果有)。

ksh88

使用 fc 时,如果命令形式为

fc -e − [old=new] [command],

fc -s [old=new] [command],

command 会在 old=new 替换执行后重新执行。如果不存在 command 参数,则会执行在此终端键入的最近一个命令。

使用 fc 时,如果命令形式为

fc [-e ename] [-nlr ] [first [last]],

则会从在终端键入的最近 HISTSIZE 个命令中,选择从第 first 个到第 last 个的一系列命令。参数 firstlast 可以指定为数字或字符串。字符串用于查找以指定字符串开头的最近命令。负数用作到当前命令数的偏移。如果选择了 –l 标志,则命令将列在标准输出中。否则,将在包含这些键盘命令的文件中调用编辑器程序 – e name。如果未提供 ename,则会将变量 FCEDIT 的值(缺省值 /bin/ed)用作编辑器。编辑完成后,将执行编辑后的命令。如果未指定 last,则会将它设置为 first。如果未指定 first,则针对编辑和列显的缺省值分别为上一条命令和 −16。标志 –r 用于颠倒命令顺序,而标志 –n 用于在列显时抑制命令编号。(有关命令行编辑的更多信息,请参见 ksh88(1)。)

HISTFILE

如果在调用 shell 时设置了此变量,则此变量的值是存储命令历史记录时所使用的文件的路径名。

HISTSIZE

如果在调用 shell 时设置了此变量,此 shell 可访问的以前输入的命令的数目则大于或等于此数目。缺省值为 128

命令重新输入:

从终端设备输入的最近 HISTSIZE 个(缺省值为 128)命令的文本保存在 history 文件中。如果未设置 HISTFILE 变量或者如果此变量指定的文件无法写入,则会使用 $HOME/.sh_history。shell 可以访问使用指定的同一 HISTFILE 的所有非交互式 shell 的命令。特殊命令 fc 用来列出或编辑此文件的某个部分。要编辑或列出的文件部分可以根据编号进行选择,或者通过指定此命令的第一个字符或前几个字符来进行选择。可以指定一个命令或一系列命令。如果未将编辑器程序指定为 fc 的参数,则会使用变量 FCEDIT 的值。如果未定义 FCEDIT,则会使用 /bin/ed。退出编辑器时,将输出并重新执行编辑后的命令。编辑器名称 用于跳过编辑阶段,并重新执行命令。在这种情况下,在执行之前可使用 old =new 格式的替换参数来修改命令。例如,如果 r 的别名为 ´fc –e − ´,则键入 `r bad=good c' 将重新执行以字母 c 开头的最近的命令,并将第一次出现的字符串 bad 替换为字符串 good

在复合命令中使用 fc 内置命令会导致整个命令从历史记录文件中消失。

ksh

hist 用于列出、编辑或重新执行以前输入到当前 shell 环境中的命令。

命令历史记录列表按编号引用命令。列表中的第一个编号是任意选择的。在登录会话期间,编号与其对应的命令之间的关系不会发生变化。当编号达到 32767 时,会从 1 开始重新编号,但仍会保留各命令的顺序。

在未指定 l 选项的情况下编辑命令时,所得到的行会输入在历史记录列表结尾处,然后由当前 shell 重新执行。引发编辑的 hist 命令不会输入到历史记录列表中。如果编辑器返回一个非零退出状态,则这将禁止向历史记录列表中输入,还会禁止重新执行命令。命令行变量赋值和重定向会影响 hist 命令和重新执行的命令。

firstlast 用于定义命令的范围。将 firstlast 指定为以下类型之一:

number

表示命令编号的一个正数。可以将 + 符号放在 number 前面。

-number

表示在 number 个命令之前执行的命令的一个负数。例如,-1 指的是前一条命令。

string

string 是指最近输入的以 string 开头的命令。string 不得包含 =

如果省略了 first,则将使用前一条命令,除非指定了 -l,在此情况下它缺省设置为 -16,而 last 缺省设置为 -1

如果指定了 first 但省略了 last,则 last 缺省设置为 first,除非指定了 -l,在此情况下它缺省设置为 -1

如果未指定编辑器,当设置了 HISTEDIT 变量时将使用该变量指定的编辑器,否则,当设置了 FCEDIT 变量时将使用该变量指定的编辑器,其他情况下将使用 ed

选项

支持以下选项:

–e editor

使用 editor 指定的编辑器编辑命令。editor 字符串是一个实用程序名称,可以通过 PATH 变量进行搜索。未指定 –e 时,FCEDIT 变量中的值将用作缺省值。如果 FCEDIT 为空或未设置,则会使用 ed 作为编辑器。

–l

(字母 ell。)列出命令,但不针对它们调用编辑器。命令将按照 firstlast 操作数指示的顺序写入,但会受 –r 的影响,而且每个命令前都带有命令编号。

–n

在通过 –l 列出命令时抑制命令编号。

–r

颠倒命令的列出顺序(使用 –l 时)或编辑顺序(–l–s 均未使用时)。

–s

重新执行命令,但不调用编辑器。

ksh

ksh 支持以下选项:

–e editor

指定用来编辑历史记录命令的编辑器。editor 的值为 - 等效于指定 –s 选项。

–l

列出命令,但不编辑和重新执行这些命令。

–N num

从之前的 num 个命令开始。

–n

列出命令时抑制命令编号。

–p

将每个操作数的历史记录展开的结果写入到标准输出。将忽略所有其他选项。

–r

颠倒命令的顺序。

–s

重新执行命令,但不调用编辑器。在这种情况下,可以指定一个 old=new 格式的操作数以在重新执行命令前将命令中第一次出现的字符串 old 替换为 new

操作数

支持下列操作数:

first
last

选择要列出或编辑的命令。可以访问的以前的命令数是由 HISTSIZE 变量的值确定的。firstlast 或两者的值可以为以下类型之一:

[+]number

表示命令编号的一个正数。可以使用 –l 选项显示命令编号。

number

表示在 number 个命令之前执行的命令的一个十进制负数。例如,−1 指的是前一条命令。

string

表示最近输入的以某字符串开头的命令的字符串。如果也没有随 –s 指定 old=new 操作数,则 first 操作数的字符串形式不能包含嵌入的等号。

使用带 –s 的概要形式时,如果省略了 first,则将使用前一条命令。

对于不带 –s 的概要形式

  • 如果省略了 last,则当指定了 –l 时,last 会缺省设置为前一条命令;否则,它将缺省设置为 first

  • 如果同时省略了 firstlast,则会根据 –l 选项是否使用,列出前 16 个命令或编辑前一个命令。

  • 如果同时提供了 firstlast,则会编辑从 firstlast 的所有命令(未使用 –l,或者列出这些命令(使用了 –l 时)。要编辑多个命令,需要同时向编辑器提供所有这些命令,且每个命令都另起一行。如果 first 代表的命令较之 last 更新,则命令会按照倒序列出或编辑,等同于使用了 –r。例如,第一行上的以下命令等同于第二行上的相应命令:

    fc -r 10 20     fc    30 40 
    fc   20 10      fc -r 40 30
  • 使用一个范围内的命令时,如果指定的 firstlast 值不在历史记录列表内,这不算是错误。fc 会相应替代表示列表中最旧或最新命令的值。例如,如果历史记录列表中只有编号为 1 至 10 的十个命令:

    fc -l 
    fc 1 99

    则会分别列出和编辑全部十个命令。

old=new

将要重新执行的命令中第一次出现的字符串 old 替换为字符串 new

输出

输出

使用 –l 选项列出命令时,列表中各命令的格式如下:

"%d\t%s\n", <line number>, <command>

同时指定了 –l–n 选项时,各命令的格式为:

"\t%s\n", <command>

如果 commandcommand 包含多行,则第一行后的行显示为:

"\t%s\n", <continued-command>

示例

示例 1 使用 history 和 fc

             csh                                     ksh88

% history                               $ fc -l
  1   cd /etc                             1   cd /etc
  2   vi passwd                           2   vi passwd
  3   date                                3   date
  4   cd                                  4   cd
  5   du .                                5   du .
  6   ls -t                               6   ls -t
  7   history                             7   fc -l

% !d                                    $ fc -e - d
  du .                                    du .
  262   ./SCCS                            262   ./SCCS
  336   .                                 336   .

% !da                                   $ fc -e - da
  Thu Jul 21 17:29:56 PDT 1994            Thu Jul 21 17:29:56 PDT 1994

%                                       $ alias \!='fc -e -'

% !!                                    $ !
  date                                    alias ='fc -e -'
  Thu Jul 21 17:29:56 PDT 1994

环境变量

有关影响 fc 执行的环境变量 LC_CTYPE、LC_MESSAGES 和 NLSPATH 的描述,请参见 environ(5)

FCEDIT

此变量(经 shell 展开后)将确定 –e editor 选项的 editor 选项参数的缺省值。如果 FCEDIT 为空或未设置,则会使用 ed(1) 作为编辑器。

HISTFILE

确定用于指定命令历史记录文件的路径名。如果未设置 HISTFILE 变量,则 shell 会尝试在用户的起始目录中访问或创建 .sh_history 文件。如果 shell 无法获得对历史记录文件的读写访问权限或无法创建该文件,则它会使用一种未指定的机制来确保历史记录正常发挥作用。(本部分中提到的历史记录“文件”应被理解为是指此类情况下的这种未指定的机制。)fc 可以选择仅在初始化历史记录文件时访问此变量;受用户发出的命令、ENV 变量指定的文件或 /etc/profile 等系统启动文件的影响,fcsh 首次尝试从历史记录文件中检索条目或者向其中添加条目时,会发生此初始化。(历史记录文件的初始化过程可能依赖于系统启动文件,因为它们可能包含有效取代用户的 HISTFILE 和 HISTSIZE 设置的命令。例如,函数定义命令记录在历史记录文件中,除非设置了 set –o nolog 选项。如果系统管理员将函数定义纳入在 ENV 文件之前调用的某个系统启动文件中,则历史记录文件在用户有机会影响其特性之前就已经初始化。)调用 shell 时会先行访问变量 HISTFILE。对 HISTFILE 所做的任何更改在调用另一个 shell 前都不会生效。

HISTSIZE

确定一个表示可以访问的以前命令数限制的十进制数字。如果未设置此变量,则将使用大于或等于 128 的未指定缺省值。调用 shell 时会先行访问变量 HISTSIZE。对 HISTSIZE 所做的任何更改在调用另一个 shell 前都不会生效。

退出状态

将返回以下退出值:

0

成功完成了列出操作。

>0

出现错误。

否则,退出状态为 fchist 执行的命令的退出状态。

属性

有关下列属性的说明,请参见 attributes(5)

属性类型
属性值
可用性
system/core-os

另请参见

csh(1)ed(1)ksh(1)ksh88(1)set(1)sh(1)source(1)attributes(5)environ(5)