Ash - Linux命令 - UNIX命令

名称

sh - 命令解释器( shell

概要

sh [ - / + aCefnuvxIimqsVEbc ] [ - o longname ] - 字符 [ 目标... ]

描述

Sh是系统的标准命令解释器。 sh的当前版本正在进行更改,以符合shell的POSIX 1003.2和1003.2a规范。 这个版本有很多功能,使它在某些方面与Korn shell相似,但它不是Korn shell克隆(请参阅ksh(1))。 只有POSIX指定的功能加上几个伯克利扩展,才被纳入到这个shell中。 我们期望在4.4 BSD发布时符合POSIX标准 。 这个手册页并不打算成为教程或shell的完整规范。

概观

shell是一个从文件或终端读取行,解释它们并通常执行其他命令的命令。 这是用户登录系统时运行的程序(尽管用户可以使用chsh(1)命令选择不同的shell)。 Shell实现了一种具有流控制结构的语言,这是一种除数据存储外还提供各种功能的宏功能,以及内置的历史和行编辑功能。 它集成了许多功能来帮助交互式使用,并且具有解释性语言对于交互式和非交互式使用(shell脚本)都很常见的优点。 也就是说,命令可以直接输入到正在运行的shell中,也可以放入一个文件中,并且该文件可以由shell直接执行。

调用

如果不存在任何参数,并且如果shell的标准输入连接到终端(或者如果设置了-i标志),并且-c选项不存在,则shell将被视为交互式shell 。 交互式shell通常会在每个命令之前提示并以不同方式处理编程和命令错误(如下所述)。 第一次启动时,shell会检查参数0,如果它以短划线“ - ”开头,则shell也被视为登录shell。 这通常由系统在用户首次登录时自动完成。登录shell首先从文件/ etc / profile和.profile(如果存在)读取命令。 如果环境变量ENV在进入shell时设置,或者在登录shell的.profile中设置,则shell接下来从ENV中命名的文件读取命令。因此,用户应该放置仅在.profile文件中的登录时间以及ENV文件中每个shell都执行的命令。 要将ENV变量设置为某个文件,请将以下行放在您主目录的.profile文件中

ENV = $ HOME / .shinit; 导出ENV

替换``.shinit''你想要的任何文件名 。 由于每次调用shell都会读取ENV文件,包括shell脚本和非交互式shell,下面的范例对于将ENV文件中的命令限制为交互式调用很有用。 将命令放在下面的“case”和“ esac ”中(这些命令在后面描述):

case $ - in * i *)

命令仅用于交互式使用

...

ESAC

如果已经指定了除选项以外的命令行参数,那么shell将第一个参数视为从中读取命令的文件的名称(shell脚本),其余参数设置为shell的位置参数($ 1 ,$ 2等)。 否则,shell将从其标准输入中读取命令。

参数列表处理

所有的单字母选项都有一个相应的名称,可用作-o选项的参数。 set -o名称在下面的描述中的单个字母选项旁边提供。 指定短划线“ - ”将打开该选项,而使用加号“+”则禁用该选项。 以下选项可以通过命令行或集合(1)内置(稍后介绍)进行设置。

- 一个 allexport

导出分配给的所有变量。 (用于4.4alpha的UNIMPLEMENTED)

-C

从命令行读取命令。 没有命令将从标准输入中读取。

-C noclobber

不要用``>''覆盖现有的文件(UNIMPLEMENTED for 4.4alpha)

-e errexit

如果不是交互式的,如果任何未经测试的命令失败,立即退出。 如果该命令用于控制if elif whileuntil,或者该命令是“&&”或“||”运算符的左侧操作数,则命令的退出状态被视为明确测试过。

-f noglob

禁用路径名扩展。

-n noexec

如果不是交互式,请阅读命令但不要执行它们。 这对于检查shell脚本的语法很有用。

-u 名词集

尝试展开未设置的变量时,将消息写入标准错误,并且如果外壳不是交互式的,请立即退出。 (用于4.4alpha的UNIMPLEMENTED)

-v 冗长

shell在读取时将其输入写入标准错误。 用于调试。

-x xtrace

将每个命令写入标准错误 (在执行之前以“+”开头),用于调试。

-q quietprofile

如果设置了-v-x选项,则在读取初始化文件时不要应用它们,这些文件是/ etc / profile .profile和ENV环境变量指定的文件。

- 我 不理会

交互时忽略输入的EOF。

-i 互动

强制shell以交互方式行为。

-m 监视器

打开作业控制(交互时自动设置)。

-s stdin

标准输入读取命令(如果没有文件参数,则自动设置)。 这个选项在shell已经开始运行后(即set(1))设置后没有效果。

-V vi

启用内置的vi(1)命令行编辑器(如果已设置,则禁用 - E )。

-E emacs

启用内置的emacs(1)命令行编辑器(如果已设置,则禁用 - V )。

-b 通知

启用后台作业完成的异步通知。 (用于4.4alpha的UNIMPLEMENTED)

词汇结构

shell根据文件中的行读取输入,并以空格(空白和制表符)将其分解为单词,并在特定序列的字符处对称为“运算符”的shell特殊序列。有两种类型的运算符:控制操作员和重定向操作员(他们的含义在后面讨论)。 以下是运营商列表:

“控制操作员:”

&&&(); ;; | || <换行符>

“重定向运营商:”

<>> | << >> <&>&<< - <>

引用

引用用于删除某些字符或单词对shell的特殊含义,如操作符,空格或关键字。 有三种引用类型:匹配的单引号,匹配的双引号和反斜杠。

反斜杠

反斜线保留下列字符的字面含义,但Aq换行符除外。 Aq换行符之前的反斜杠被视为续行。

单引号

用单引号括起字符保留了所有字符的字面含义(单引号除外,因此不可能将单引号放在单引号字符串中)。

双引号

在双引号内包围字符保留了除美元符号($)反引号(`)和反斜线(\)之外的所有字符的字面含义。双引号内的反斜线在历史上是奇怪的,并且仅用于引用以下字符:

$`\ <新行>

否则它仍然是文字。

保留字

保留字是对外壳具有特殊含义的字,并且在行的开头和控制操作符之后被识别。 以下是保留字:

Ta elif Ta fi Ta Ta Ta

否则Ta为Ta然后Ta {Ta}

如果Ta Ta esac 做Ta Ta做Ta

他们的含义在后面讨论。

别名

别名是使用别名 (1)内置命令设置的名称和相应的值。 无论何时可能发生保留字(见上文),并且在检查保留字之后,shell会检查该字是否与别名相匹配。 如果确实如此,则用输入流中的值替换它。 例如,如果有一个名为“lf”的别名,其值为“ls -F”,那么输入:

如果foobar

会成为

ls -F foobar

别名为幼稚的用户提供了一种便捷的方式来创建命令的简写,而无需学习如何使用参数创建函数。 它们也可以用来创建词法不明确的代码。 这种使用是不鼓励的。

命令

shell根据一种语言解释它读取的单词,其规范不在本手册页的范围内(请参阅POSIX 1003.2文档中的BNF)。 本质上,读取一行,如果该行的第一个字(或控制操作符之后)不是保留字,那么shell已经识别出一个简单的命令。 否则,复杂的命令或其他特殊构造可能已被识别。

简单的命令

如果一个简单的命令已被识别,那么shell将执行以下操作:

  1. “name = value”形式的引导词被剥离并分配给简单命令的环境。 重定向操作符及其参数(如下所述)被删除并保存以供处理。
  2. 其余单词按照“扩展”一节中的描述进行扩展,第一个剩余单词被认为是命令名称,命令已定位。 其余单词被视为命令的参数。 如果没有生成命令名,那么在项1中识别的``name = value''变量赋值会影响当前shell。
  3. 重定向按照下一节所述执行。

重定向

重定向用于改变命令读取输入或发送输出的位置。 通常,重定向打开,关闭或复制对文件的现有引用。 用于重定向的整体格式是:

[red] -ir文件

redir-op是前面提到的重定向操作符之一。 以下是可能的重定向列表。 Bq n是一个可选的数字,如'3'(而不是'Bq 3',指的是文件描述符。

[n]>文件

将标准输出(或n)重定向到文件。

[n]> | 文件

相同,但覆盖 - C选项。

[n] >>文件

将标准输出(或n)附加到文件。

[n] <文件

从文件重定向标准输入(或n)。

[n1] <&n2

从文件描述符n2复制标准输入(或n1)。

[n] <& -

关闭标准输入(或n)。

[n1]>&n2

从n2复制标准输出(或n1)。

[n]>& -

关闭标准输出(或n)。

[n] <>文件

打开标准输入(或n)读取和写入文件。

以下重定向通常被称为``here-document''

[n] <<分隔符

这里-DOC文本...

分隔符

直到分隔符的连续行上的所有文本都被保存起来,并且可用于标准输入的命令或文件描述符n(如果已指定)。 如果在首行中指定的分隔符被引用,那么here-doc-text将被逐字处理,否则文本会经历参数扩展,命令替换和算术扩展(如“扩展”一节所述) '如果操作符是“<< - ”而不是“<<”,那么在here-doc-text中的前导标签将被删除。

搜索和执行

有三种类型的命令:shell函数,内置命令和普通程序 - 并且按照该顺序搜索命令(按名称)。 他们每个人都以不同的方式执行。

当执行一个shell函数时,所有的shell位置参数($ 0除外)都被设置为shell函数的参数。 显式放置在命令环境中的变量(通过在函数名称前面放置赋值)被设置为函数的本地值,并被设置为给定的值。 然后执行函数定义中给出的命令。 命令完成后,位置参数将恢复为其原始值。 这一切都发生在当前shell中。

Shell内置函数在内部执行到外壳,而不会产生新的进程。

否则,如果命令名称与功能或内建不匹配,则在文件系统中搜索命令作为正常程序(如下一节所述)。 当正常程序执行时,shell运行程序,将参数和环境传递给程序。 如果程序不是一个正常的可执行文件(例如,如果它不是以“#!”为ASCII码的“幻数”开始,那么execve(2)会返回Er ENOEXEC),那么shell将解释程序子shell。 在这种情况下,子shell将自行重新初始化,因此效果就好像新的shell已被调用来处理临时shell脚本,除了位于父shell中的散列命令的位置将被儿童。

请注意,本文档以前的版本和源代码本身误导性地和零星地将不带幻数的shell脚本称为“shell过程”。

路径搜索

在查找命令时,shell首先查看它是否具有该名称的shell功能。 然后通过该名称查找内置命令。 如果没有找到内建命令,则会发生以下两件事之一:

  1. 包含斜杠的命令名称只是执行而不执行任何搜索。
  2. shell会依次搜索PATH中的每个条目以查找该命令。 PATH变量的值应该是由冒号分隔的一系列条目。 每个条目由一个目录名称组成。 当前目录可以由空目录名称隐含指示,或者由一个单独的句点明确指示。

命令退出状态

每个命令都有一个退出状态,可以影响其他shell命令的行为。 范例是,一个命令以正常或成功退出为零,而失败,错误或错误指示为非零。 每个命令的手册页应指明各种退出代码及其含义。 此外,内置命令返回退出代码,就像执行的shell函数一样。

复杂命令

复杂命令是简单命令与控制操作符或保留字的组合,共同创建一个更大的复杂命令。 更一般地说,一个命令是以下之一:

除非另有说明,否则命令的退出状态是由命令执行的最后一个简单命令的状态。

管道

管道是由控制操作符|分隔的一个或多个命令的序列。 除最后一个命令外的所有标准输出都连接到下一个命令的标准输入。 像往常一样,最后一个命令的标准输出是从shell继承而来的。

管道的格式是:

[!] command1 [| command2 ...]

command1的标准输出连接到command2的标准输入。 标准输入,标准输出或两个命令都被认为由流水线在由作为命令一部分的重定向操作符指定的任何重定向之前分配。

如果管道不在后台(稍后讨论),则shell等待所有命令完成。

如果保留字! 不在管道之前,退出状态是在管道中指定的最后一个命令的退出状态。 否则,退出状态是最后一个命令退出状态的逻辑NOT。 也就是说,如果最后一个命令返回零,则退出状态为1; 如果最后一个命令返回大于零,则退出状态为零。

由于标准输入或标准输出的管道分配或两者都在重定向之前发生,因此可以通过重定向进行修改。 例如:

$ command1 2>&1 | 命令2

将command1的标准输出和标准错误都发送到command2的标准输入。

一个 ; 或终止符导致前面的AND-OR-列表(下面描述)被顺序执行; a会导致前面的AND-OR列表异步执行。

请注意,与其他一些shell不同,流水线中的每个进程都是调用shell的子进程(除非它是shell内建的,在这种情况下,它将在当前shell中执行 - 但它对环境的任何影响都将被清除)。

背景命令 -

如果命令由控制操作符&符号(&)终止,那么shell将异步执行该命令 - 也就是说,在执行下一个命令之前,shell不会等待命令完成。

在后台运行命令的格式是:

command1&[command2&...]

如果shell不是交互式的,则异步命令的标准输入设置为/ dev / null

列表 - 一般说来

列表是由换行符,分号或和号分隔的零个或多个命令的序列,并且可以由这三个字符之一终止。 列表中的命令按照它们写入的顺序执行。 如果命令后面跟着一个&符号,shell会启动该命令并立即进入下一个命令; 否则它会在继续下一个命令之前等待命令终止。

短路列表运算符

“&&”和“||”是AND-OR列表运算符。 `&&''执行第一个命令,然后在第一个命令的退出状态为零时执行第二个命令。 ``||''类似,但是如果第一个命令的退出状态为非零,则执行第二个命令。 “&&”和“||”都具有相同的优先级。

流程控制构造 - 如果,同时,为了

if命令的语法是

如果列表
然后列出
[elif list
然后列出] ...
[其他列表]
科幻

while命令的语法是

而列表
做清单
DONE

这两个列表重复执行,而第一个列表的退出状态为零。 直到命令是相似的,但是直到代替while为止,这会导致它重复,直到第一个列表的退出状态为零。

for命令的语法是

对于词中的变量...
做清单
DONE

单词被展开,然后该列表被重复执行,并依次为每个单词设置变量。 做和完成可以用“{”和“`”来代替

break和continue命令的语法是

休息[num]
继续[num]

中断终止num或最后的while循环。 继续进行最内层循环的下一次迭代。 这些被实现为内置命令。

case命令的语法是

案件字
模式)列表;;
...
ESAC

该模式实际上可以是一个或多个模式(请参阅稍后描述的Shell模式),由“`”字符分隔。

将命令组合在一起

命令可以通过写入来分组

(名单)

要么

{list;

其中的第一个在子shell中执行命令。 内置命令分组到一个(列表)不会影响当前的shell。 第二种形式不会分叉另一个外壳,所以效率稍高。 通过这种方式将命令组合在一起可以让您重定向输出,就像它们是一个程序一样:

{printf hello; printf world \ n“;}>问候

功能

函数定义的语法是

name()命令

函数定义是一个可执行语句; 在执行时它会安装一个名为name的函数并返回一个零的退出状态。 该命令通常是一个列在“`{''和``}”之间的列表

通过使用本地命令可以将变量声明为函数本地。 这应该显示为函数的第一个语句,并且语法是

本地[变量| - ] ...

本地是作为内置命令实现的。

当一个变量是局部变量时,它将继承初始值,并从周围范围中具有相同名称的变量中导出和只读标志(如果有的话)。 否则,该变量最初是未设置的。 shell使用动态作用域,因此,如果将变量x local设为函数f,然后调用函数g,那么对g中创建的变量x的引用将引用f中声明的变量x,而不是名为x的全局变量。

唯一的特殊参数可以是局部变量````````````````当前任何外壳选项都可以通过函数内的set命令改变,以便在函数返回时恢复原始值。

返回命令的语法是

返回[exitstatus

它终止当前正在执行的功能。 返回是作为内置命令实现的。

变量和参数

shell维护一组参数。 由名称表示的参数称为变量。 启动时,shell将所有环境变量转换为shell变量。 可以使用表单设置新变量

名称=值

由用户设置的变量必须包含仅由字母,数字和下划线组成的名称 - 第一个名称不能是数字。 参数也可以用数字或特殊字符表示,如下所述。

位置参数

位置参数是由数字(n> 0)表示的参数。 这些shell最初将它们设置为遵循shell脚本名称的命令行参数的值。 set (1)builtin也可以用来设置或重置它们。

特殊参数

特殊参数是由以下特殊字符之一表示的参数。 该参数的值在其字符旁边列出。

*

从一个开始扩展到位置参数。 当扩展发生在双引号字符串内时,它将扩展为单个字段,每个参数的值由IFS变量的第一个字符分隔,如果IFS未设置,则由<空格>分隔。

@

从一个开始扩展到位置参数。 当扩展发生在双引号内时,每个位置参数作为单独的参数展开。 如果没有位置参数,则@的扩展将生成零参数,即使@是双引号也是如此。 例如,如果$ 1是“abc”而$ 2是“def ghi”,那么Qq $ @扩展为两个参数:

abc def ghi

扩展到位置参数的数量。

扩展到最新管道的退出状态。

- (连字符)

根据调用,set builtin命令或Shell隐式指定,扩展为当前选项标志(单字母选项名称连接成一个字符串)。

$

扩展到被调用的shell的进程ID。 子外壳保留与其父母相同的$值。

扩展为从当前shell执行的最新后台命令的进程ID。 对于管道,进程ID是管道中最后一个命令的ID。

0(零)。

扩展为shell或shell脚本的名称。

文字扩展

本节描述了对单词执行的各种扩展。 如后文所述,并非所有扩展都在每个单词上执行。

在单个单词中出现的Tilde扩展,参数扩展,命令替换,算术扩展和引用移除可扩展为单个字段。 只有字段分割或路径名扩展可以从一个单词创建多个字段。 如上所述,该规则的一个例外是特殊参数@在双引号内的扩展。

单词扩展的顺序是:

  1. Tilde扩展,参数扩展,命令替换,算术扩展(这些都是同时发生的)。
  2. 除非IFS变量为空,否则字段拆分在步骤(1)生成的字段上执行。
  3. 路径名扩展(除非设置-f有效)。
  4. 报价清除。

$字符用于引入参数扩展,命令替换或算术评估。

Tilde扩展(代替用户的主目录)

以不加引号的代字符(〜)开头的单词将经历代字符扩展。 所有直到斜杠(/)或单词结尾的字符都被视为用户名,并被用户的主目录替换。 如果用户名缺失(如在〜/ foobar中),代字号将被替换为HOME变量(当前用户的主目录)的值。

参数扩展

参数扩展的格式如下所示:

表达式由所有字符组成,直到匹配的“}”任何“}”由反斜线或带引号的字符串转义,并且嵌入的算术扩展,命令替换和变量扩展中的字符在确定匹配``}''

参数扩展最简单的形式是:

参数的值(如果有的话)被替换。

参数名称或符号可以用大括号括起来,除了位置参数超过一位数字或参数后面跟着一个可以解释为名称一部分的字符之外,这些参数是可选的。 如果参数扩展发生在双引号内:

  1. 扩展结果不会执行路径名扩展。
  2. 字段拆分不会对扩展结果执行,但@除外。

另外,可以使用以下格式之一修改参数扩展。

使用默认值。 如果参数未设置或为空,则替换单词的扩展名; 否则,参数的值被替换。

分配默认值。 如果参数未设置或为空,则将单词的扩展分配给参数。 在所有情况下,参数的最终值都会被替换。 只有变量,而不是位置参数或特殊参数,可以用这种方式分配。

如果为空或未设置,则指示错误。 如果参数未设置或为空,则字的扩展(或者指示它的消息未被设置,如果字被省略)被写入标准错误,并且shell以非零退出状态退出。 否则,参数的值将被替换。 交互式shell不需要退出。

使用替代值。 如果参数未设置或为null,则替换为null; 否则,词的扩展被替换。

在前面显示的参数扩展中,以格式使用冒号会导致对未设置或null参数的测试; 省略冒号会导致仅对未设置的参数进行测试。

字符串长度。 参数值的字符长度。

以下四种参数扩展提供了子串处理。 在每种情况下,模式匹配符号(请参阅Shell模式),而不是正则表达式符号,用于评估模式。 如果参数是*或@,则扩展的结果是未指定的。 将完整的参数展开字符串括在双引号中并不会导致引用以下四种模式字符,而括号中的引号字符具有此效果。

删除最小的后缀模式。 这个词被扩大到产生一个模式。 然后参数展开产生参数,后缀的最小部分由被删除的模式匹配。

删除最大的后缀模式。 这个词被扩大到产生一个模式。 然后参数展开产生参数,后缀的最大部分由被删除的模式匹配。

删除最小的前缀模式。 这个词被扩大到产生一个模式。 然后参数展开产生参数,其中与被模式匹配的前缀的最小部分被删除。

删除最大的前缀模式。 这个词被扩大到产生一个模式。 然后参数展开产生参数,其中前缀的最大部分由被删除的模式匹配。

命令替换

命令替换允许替换命令名称本身的输出。 当命令被包含时,命令替换发生如下:

$(命令)

或宝``反引号''版本Pc:

`command`

shell通过在子shell环境中执行命令来扩展命令替换,并用命令的标准输出替换命令替换,并在替换结束时删除一个或多个的序列。 (在输出结束之前嵌入 s不会被删除;但是,在字段拆分过程中,它们可能会被转换为 s,具体取决于IFS的值和引用是否有效。)

算术扩展

算术扩展提供了一种评估算术表达式并替换其值的机制。 算术扩展的格式如下所示:

$((表达式))

该表达式被视为使用双引号,除非表达式中的双引号没有专门处理。 外壳扩展了表达式中的所有标记以进行参数扩展,命令替换和引用移除。

接下来,shell将它视为一个算术表达式并替换表达式的值。

白色空间分裂(场分裂)

在参数扩展,命令替换和算术扩展之后,shell会扫描扩展和替换的结果,而这些扩展和替换的结果在双引号中不会出现在字段拆分中,并且会导致多个字段。

shell将IFS的每个字符视为分隔符,并使用分隔符将参数扩展和命令替换的结果拆分为字段。

路径名称扩展(文件名称生成)

除非设置了-f标志,否则在分词完成后执行文件名称生成。 每个单词都被看作是一系列用斜杠分隔的模式。 扩展过程用与所指定模式匹配的字符串替换每个模式的所有现有文件的名称来替换该单词的名称。 对此有两个限制:第一,模式不能匹配包含斜线的字符串;第二,模式不能匹配以句点开头的字符串,除非模式的第一个字符是句点。 下一节描述用于路径名扩展和情况(1)命令的模式。

壳模式

一个模式由普通字符组成,这些字符匹配自己和元字符。 元字符是``````````````''和``''如果引用这些字符,它们会失去其特殊含义。 当执行命令或变量替换并且美元符号或后引号不是双引号时,会扫描这些字符的变量值或命令输出,并将它们转换为元字符。

星号(``*'')匹配任何字符串。 问号可以匹配任何单个字符。 左括号(``['')引入一个字符类。 如果缺少``'''',那么字符类的末尾用(```'''')表示,然后'`''匹配'[''而不是引入一个字符类。 字符类匹配方括号之间的任何字符。 可以使用减号指定一系列字符。 字符类可以通过将感叹号设置为字符类的第一个字符来补充。

要在一个字符类中包含一个``]'',使它成为列出的第一个字符(在'!'之后(如果有的话))。 要包括一个减号,使其成为列出的第一个或最后一个字符

内置命令

本节列出了内置的内置命令,因为它们需要执行一些独立进程无法执行的操作。 除此之外,还有其他几个命令可以用于提高效率(例如回显 1)。

返回0(真)退出值的空命令。

文件

指定文件中的命令由shell读取并执行。

别名 [ 名称 [ =字符串... ]]

如果指定了name = string ,那么shell会使用值string定义别名。如果仅指定name,则会打印别名的值。 如果没有参数, 别名内建输出所有定义的别名的名称和值(请参阅unalias)

bg [ 工作] ...

在后台继续指定的作业(或当前作业,如果没有作业)。

命令 命令arg ...

执行指定的内置命令。 (当你有一个与内建命令同名的shell函数时,这很有用。)

cd [ 目录 ]

切换到指定的目录(默认为$ HOME)如果cd命令的环境中出现CDPATH条目或设置了shell变量CDPATH且目录名称不以斜杠开头,则会搜索CDPATH中列出的目录为指定的目录。 CDPATH的格式与PATH的格式相同在交互式shell中,如果cd命令与用户给出的名称不同, cd命令将打印出实际切换到的目录的名称。 由于CDPATH机制被使用或者因为符号链接被跨越,这些可能会不同。

评估 字符串...

用空格连接所有参数。 然后重新解析并执行该命令。

exec [ command arg ... ]

除非省略命令,否则shell进程会被指定的程序(它必须是一个真正的程序,而不是shell内置的函数)替换。 exec命令上的任何重定向都将被标记为永久的,以便在exec命令完成时它们不会被撤消。

退出 [ exitstatus ]

终止shell进程。 如果给出了exitstatus ,它将用作shell的退出状态; 否则使用上述命令的退出状态。

导出 名称...

导出-p

指定的名称将被导出,以便它们将出现在后续命令的环境中。 取消导出变量的唯一方法是取消设置。 shell允许在写入时导出变量的值

导出名称=值

export命令不带任何参数列出所有导出变量的名称。 使用指定的-p选项,输出将被格式化为适合非交互式使用。

fc [ - e 编辑器 ] [ 第一 [ 最后 ]]

fc -l [ - nr ] [ first [ last ]]

fc -s [ old = new ] [ first ]

内置的fc列出或编辑并重新执行先前输入到交互式shell的命令。

-e编辑器

使用编辑器命名的编辑器编辑命令。 编辑器字符串是一个命令名称,需要通过PATH变量进行搜索。 未指定-e时, FCEDIT变量中的值将用作默认值。 如果FCEDIT为空或未设置,则使用EDITOR变量的值。 如果EDITOR为空或未设置,则ed(1)用作编辑器。

-l(ell)

列出命令而不是调用它们的编辑器。 命令以第一个和最后一个操作数指示的顺序写入,受到-r影响,每个命令都以命令编号开头。

-n

使用-l列出时禁止命令编号。

-r

颠倒列出的命令的顺序(使用-l或编辑(既不使用-l也不使用s)

-s

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

第一

持续

选择要列出或编辑的命令。 先前可以访问的命令的数量由HISTSIZE变量的值决定。 第一个或最后一个或两个值都是以下值之一:

[+]数

表示命令编号的正数; 命令号码可以用-l选项显示。

-数

表示先前执行的命令数的命令的负数十进制数。 例如,-1是前一个命令。

一个字符串,指示以该字符串开头的最近输入的命令。 如果old = new操作数不是用 - s指定的,则第一个操作数的字符串形式不能包含嵌入的等号。

以下环境变量影响fc的执行:

FCEDIT

要使用的编辑器的名称。

HISTSIZE

先前可访问的命令的数量。

fg [ 工作 ]

将指定的作业或当前作业移到前台。

getopts optstring var

POSIX getopts命令不要与贝尔实验室衍生的getopt(1)混淆。

第一个参数应该是一系列字母,每个字母后面可以有一个冒号,以表示该选项需要参数。 指定的变量被设置为解析的选项。

getopts命令由于处理了包含空格的参数而弃用了较早的getopt(1)实用程序。

getopts内建函数可用于从参数列表中获取选项及其参数。 调用时, getopts将选项字符串中的下一个选项的值放入var指定的shell变量的列表中,并将其索引放入shell变量OPTIND中。调用shell时, OPTIND初始化为1.对于每个需要一个参数, getopts内建函数将它放在shell变量OPTARG中如果在optstring中不允许有一个选项,那么OPTARG将被取消设置。

optstring是一串可识别的选项字母。 如果一个字母后跟一个冒号,该选项预计会有一个参数,它可能会或可能不会被空格分隔。 如果在预期的地方找不到选项字符, getopts会将变量var设置为“?”, getopts将取消设置OPTARG并将输出写入标准错误。 通过指定一个冒号作为optstring的第一个字符,所有错误都将被忽略。

达到最后一个选项时返回非零值。 如果没有剩余的参数, getopts会将var设置为特殊选项,否则将设置var为``?''

以下代码片段显示了如何处理可以采用选项[a]和[b]的命令的参数以及需要参数的选项[c]。

而getopts abc:f

情况下$ f in
a | b)flag = $ f ;;
c)carg = $ OPTARG ;;
\?)echo $ USAGE; 1号出口;;
ESAC
DONE
转移`expr $ OPTIND - 1`

该代码将接受以下任何等效的代码:

cmd -acarg文件文件
cmd -a -c arg文件文件
cmd -carg -a文件文件
cmd -a -carg - 文件文件

hash -rv 命令...

shell维护一个记录命令位置的散列表。 无论使用什么参数, hash命令都会打印出此表的内容。 自上次cd命令后未查看的条目标有星号; 这些条目可能无效。

使用参数, 散列命令从散列表中除去指定的命令(除非它们是函数),然后定位它们。 使用-v选项,hash会在找到它们时打印命令的位置。 -r选项会导致hash命令删除散列表中除函数之外的所有条目。

jobid [ 工作 ]

打印作业中进程的进程ID。 如果作业参数被省略,则使用当前作业。

工作

该命令列出了当前shell进程的子进程的所有后台进程。

PWD

打印当前目录。 内建命令可能与具有相同名称的程序不同,因为内置命令会记住当前目录的内容,而不是每次重新计算它。 这使得它更快。 但是,如果当前目录已重命名,则内置版本的pwd将继续打印该目录的旧名称。

阅读 [ - p 提示符 ] [ - r ] 变量...

如果指定了-p选项并且标准输入是终端,则会打印提示。 然后从标准输入读取一行。 从行中删除尾随的换行符,并按照上面的单词拆分章节中所述拆分该行,并且按顺序将这些段分配给变量。 至少必须指定一个变量。 如果有更多的块比变量,其余的块(以及IFS中将它们分开的字符)分配给最后一个变量。 如果有多个变量而不是块,则剩余的变量将被分配空字符串。 内置将指示成功,除非在输入时遇到EOF,在这种情况下将返回失败。

默认情况下,除非指定了-r选项,否则“\”作为转义字符,导致以下字符被直接处理。 如果反斜线后面跟有换行符,则反斜杠和换行符将被删除。

只读 名称...

只读-p

指定的名称被标记为只读,以便它们不能随后被修改或取消设置。 shell允许一个变量的值在被标记为只读的同时被设置

只读名称=值

readonly命令不带任何参数列出所有只读变量的名称。 使用指定的-p选项,输出将被格式化为适合非交互式使用。

设置 [{ - 选项| +选项| - arg ... ]

set命令执行三个不同的功能。

没有参数,它列出了所有shell变量的值。

如果给出选项,它将设置指定的选项标志,或按照名为Sx参数列表处理的部分所述清除它们。

set命令的第三个用途是将shell的位置参数的值设置为指定的参数。 要更改位置参数而不更改任何选项,请使用“ - ”作为第一个参数进行设置。 如果不存在参数,则set命令将清除所有位置参数(相当于执行`` shift $#'。'')。

变量值

赋值给变量。 (通常最好是写变量=值而不是使用setvar setvar旨在用于将值赋予名称作为参数传递的变量的函数中。)

shift [ n ]

移动位置参数n次。 换班$ 1的值设置为$ 2的值,将$ 2的值设置为$ 3的值,依此类推,将$#的值 1。 如果n大于位置参数的数量, shift会发出错误信息,并退出并返回状态2。

打印shell的累计用户和系统时间以及从shell运行的进程。 返回状态是0。

陷阱 动作 信号 ...

当收到任何指定的信号时,使shell解析并执行操作。 信号由信号编号指定。 如果信号0 ,则在shell退出时执行该操作。 动作可能为空或“ - ”,前者会导致指定的信号被忽略,后者会导致采取默认动作。 当shell剥离一个子shell时 ,它会将捕获的(但不被忽略的)信号重置为默认操作。 trap命令对进入shell时被忽略的信号没有影响。

键入 [ name ... ]

将每个名称解释为命令并打印命令搜索的分辨率。 可能的解决方案是:shell关键字,别名, shell内置 ,命令,跟踪别名和未找到。 为别名打印别名扩展; 对于命令和跟踪的别名,打印命令的完整路径名。

ulimit [ - H -S ] [ - a -tfdscmlpn [ value ]]

查询或设置流程的硬性或软性限制或设置新的限制。 硬限制(不允许进程被允许违反,并且一旦它被降低后不会被提升)和软限制(其导致进程被发信号但不一定被杀死,并且可能被提出)之间的选择由这些标志:

-H

设置或询问硬限制

-S

设置或询问软限制。 如果没有指定 - H和 - S ,则显示软极限或设置两个极限。 如果两者都被指定,则最后一个获胜。

然后,通过指定这些标志中的任何一个来选择要询问或设置的限制:

-一个

显示所有当前的限制

-t

显示或设置CPU时间限制(以秒为单位)

-F

显示或设置可创建的最大文件的限制(以512字节块为单位)

-d

显示或设置进程数据段大小的限制(以千字节为单位)

-s

显示或设置进程堆栈大小的限制(以千字节为单位)

-C

显示或设置可产生的最大核心转储大小限制(以512字节块为单位)

-m

显示或设置进程可以使用的总物理内存限制(以千字节为单位)

-l

显示或设置进程可以用mlock锁定多少内存的限制(2)(以千字节为单位

-p

显示或设置此用户可同时拥有的进程数限制

-n

显示或设置一个进程可以一次打开的数字文件的限制

如果没有指定这些,则显示或设置文件大小限制。 如果指定了值,则将限制设置为该数字; 否则显示当前限制。

可以使用sysctl(8)实用程序显示或设置任意进程的限制。

umask [ 掩码 ]

将umask的值(请参阅umask(2))设置为指定的八进制值。 如果省略参数,则会打印umask值。

unalias [ - a ] [ 名字 ]

如果指定了名称 ,则shell将删除该别名。 如果指定了-a,则会删除所有别名。

取消设定 名称...

指定的变量和函数未设置并未导出。 如果一个给定的名字同时对应一个变量和一个函数,则该变量和函数都是未设置的。

等待 [ 工作 ]

等待指定的作业完成并返回作业中最后一个进程的退出状态。 如果省略参数,请等待所有作业完成,并返回退出状态为零。

命令行编辑

当从终端以交互方式使用sh时 ,可以使用vi模式命令行编辑来编辑当前命令和命令历史记录(请参阅Sx Builtins中的fc )。 该模式使用以下描述的命令,类似于vi手册页中描述的那些命令的子集。 命令`set'-o vi启用vi模式编辑并将sh置入vi插入模式。 启用vi模式后,sh可以在插入模式和命令模式之间切换。 编辑器在这里没有完整描述,但会在后面的文档中。 它类似于vi:打字Aq ESC会让你进入命令VI命令模式。 在命令模式下命中Aq会将该行传递给shell。

重要提示:使用man 命令%man )查看特定计算机上的命令使用方式。