命令行手册

Man » sh 手册在线 - 详细的在线文档,用于 sh 手册页

🌍
dash — 命令解释器(shell)

概要

dash     [-aCefnuvxIimqVEbp]    [+aCefnuvxIimqVEbp]    [-o    option_name]    [+o    option_name]
[command_file [argument ...]]
dash -c [-aCefnuvxIimqVEbp] [+aCefnuvxIimqVEbp] [-o option_name] [+o option_name]  command_string
[command_name [argument ...]]
dash -s [-aCefnuvxIimqVEbp] [+aCefnuvxIimqVEbp] [-o option_name] [+o option_name] [argument ...]

描述

dash 是系统的标准命令解释器。当前版本的 dash 正在被修改,以符合 POSIX 1003.2 和 1003.2a 规范中关于 shell 的规定。这个版本有很多特性,使其在某些方面类似于 Korn shell,但它不是 Korn shell 的克隆(参见 ksh(1))。只有 POSIX 指定的特性,以及一些 Berkeley 扩展,才会被合并到这个 shell 中。这个手册页不是为了提供教程,也不是为了完整地描述这个 shell。

概述

shell 是一种从文件或终端读取行、解释这些行并通常执行其他命令的命令。当用户登录系统时,shell 是正在运行的程序(尽管用户可以使用 chsh(1) 命令选择不同的 shell)。shell 实现了具有流程控制结构、宏设施以及内置历史记录和行编辑功能的语言。它包含许多用于辅助交互式使用的特性,并且具有一个优势,即解释性语言同时适用于交互式和非交互式使用(shell 脚本)。也就是说,命令可以直接输入到正在运行的 shell 中,也可以放入文件中,然后由 shell 直接执行该文件。

调用

如果没有提供参数,并且 shell 的标准输入连接到终端(或者如果设置了 -i 标志),并且没有提供 -c 选项,则 shell 被认为是交互式 shell。交互式 shell 通常会在每个命令之前提示,并且以不同的方式处理编程和命令错误(如下所述)。在第一次启动时,shell 会检查第一个参数,如果它以破折号“-”开头,则 shell 也被认为是登录 shell。通常,系统会在用户第一次登录时自动执行此操作。登录 shell 首先会读取 /etc/profile 和 .profile 文件(如果它们存在)。如果环境变量 ENV 在进入交互式 shell 时设置,或者在登录 shell 的 .profile 中设置,则 shell 接下来会读取 ENV 中指定的文件中的命令。因此,用户应将仅在登录时执行的命令放在 .profile 文件中,并将每次交互式 shell 执行的命令放在 ENV 文件中。要将 ENV 变量设置为某个文件,请将以下行放在您主目录的 .profile 文件中。


ENV=$HOME/.shinit; export ENV

将“.shinit”替换为您希望使用的任何文件名。

如果命令行参数中除了选项之外还有其他参数,那么 shell 会将第一个参数视为要从中读取命令的文件名(shell 脚本),并将剩余的参数设置为 shell 的位置参数($1、$2 等)。 否则,shell 会从其标准输入读取命令。

参数列表处理

所有具有相应名称的单字母选项都可以作为 -o 选项的参数使用。 在下面的描述中,set -o name 位于单字母选项旁边。 指定破折号“-”会启用该选项,而使用加号“+”会禁用该选项。 以下选项可以从命令行或使用 set 内置命令(稍后描述)进行设置。

-a allexport  导出所有已赋值的变量。

-c  从 command_string 操作数而不是从标准输入读取命令。 特殊参数 0 将从 command_name 操作数设置,并且位置参数($1、$2 等)将从剩余的参数操作数设置。

-C noclobber  不要使用“>”覆盖现有文件。

-e errexit  如果不是交互式,则在任何未测试的命令失败时立即退出。 命令的退出状态被明确地测试,如果该命令用于控制 if、elif、while 或 until;或者如果该命令是“&&”或“||”运算符的左侧操作数。

-f noglob  禁用路径名扩展。

-n noexec  如果不是交互式,则读取命令但不执行它们。 这对于检查 shell 脚本的语法非常有用。

-u nounset  尝试扩展未设置的变量时,向标准错误写入消息,并且如果 shell 不是交互式的,则立即退出。

-v verbose  shell 将其输入写入标准错误,以便在读取时进行查看。 适用于调试。

-x xtrace  在执行每个命令之前,将其写入标准错误(前面加上一个“+”)。 适用于调试。

-I ignoreeof  忽略交互式输入中的 EOF。

-i interactive  强制 shell 以交互方式运行。

-l  使 dash 像以登录 shell 的身份被调用一样运行。

-m monitor  启用作业控制(在交互式模式下自动启用)。

-s stdin  从标准输入读取命令(如果不存在文件参数,则自动启用)。 此选项在 shell 已经开始运行后设置时(即使用 set)无效。

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

-E emacs         启用内置的 [emacs](filename://emacs.md)(1) 命令行编辑器(如果设置了 -V,则禁用它)。

-b notify        启用异步通知后台作业完成。(对于 4.4alpha 版本,尚未实现)。

-p priviliged    如果有效用户 ID 与用户 ID 不匹配,则不尝试重置有效用户 ID。 默认情况下不设置此选项,以帮助避免通过 system(3) 或 popen(3) 在 setuid root 程序中进行不正确的用法。

词法结构

Shell 从文件中逐行读取输入,并将其分解为单词,以空格(空格和制表符)以及对 shell 具有特殊意义的某些字符序列(称为“运算符”)为分隔符。 有两种类型的运算符:控制运算符和重定向运算符(它们的含义将在后面讨论)。 以下是运算符列表:

控制运算符: & && ( ) ; ;; | ||

重定向运算符: < > >| << >> <& >& <<- <>

引用

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

反斜杠

反斜杠保留以下字符的字面意义, 除外。 位于 前面的反斜杠被视为行延续。

单引号

在单引号中包含的字符保留所有字符的字面意义(除了单引号,因此无法在单引号字符串中放置单引号)。

双引号

在双引号中包含的字符保留所有字符的字面意义,但美元符号 ($)、反引号 () 和反斜杠 (\) 除外。 双引号内的反斜杠在历史上有些奇怪,它仅用于引用以下字符: $ " \ 。 否则,它保持字面意义。

保留字

保留字是具有 shell 特殊含义的单词,shell 在行首或控制运算符之后识别这些单词。 以下是保留字:

!       elif    fi      while   case
else    for     then    {       }
do      done    until   if      esac

它们的含义将在后面讨论。

别名

别名是使用 alias(1) 内置命令设置的名称及其对应值。 每当可能会出现保留字时(参见上文),并且在检查保留字之后,shell 会检查该单词是否与别名匹配。 如果匹配,它会将输入流中的别名替换为其值。 例如,如果有一个名为“lf”且值为“ls -F”的别名,则输入:

lf foobar ⟨return⟩

将变为

ls -F foobar ⟨return⟩

别名为不熟悉命令的提供了一种方便的方法,可以创建命令的简写,而无需学习如何创建带有参数的函数。 它们还可以用于创建词法上晦涩的代码。 这种用法不建议使用。


命令

Shell 会根据一种语言来解释它读取的单词,该语言的规范超出了本手册页的范围(请参阅 POSIX 1003.2 文档中的 BNF)。 基本上,Shell 会读取一行,如果该行的第一个单词(或在控制运算符之后)不是保留字,那么 Shell 就会识别出一个简单的命令。 否则,可能会识别出一个复合命令或其他特殊结构。

简单命令

如果已识别出简单命令,Shell 将执行以下操作:

      删除形式为“name=value”的行首单词,并将其分配给简单命令的环境。 删除重定向运算符及其参数(如下所述),并保存以供后续处理。

      对剩余的单词进行扩展,如“扩展”部分所述,并将剩余的第一个单词视为命令名称,并找到该命令。 剩余的单词被视为命令的参数。 如果没有结果命令名称,则在项 1 中识别的“name=value”变量赋值会影响当前 Shell。

      执行重定向,如下一部分所述。

重定向

重定向用于更改命令读取输入或发送输出的位置。 通常,重定向会打开、关闭或复制现有文件句柄。 用于重定向的总体格式为:

[n] redir-op 文件

其中 redir-op 是之前提到的重定向运算符之一。 以下是可能的重定向列表。 [n] 是 0 到 9 之间的可选数字,如“3”(而不是“[3]”),它引用一个文件描述符。

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

[n]>| 文件  相同,但覆盖 -C 选项。

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

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

[n1]<&n2    将文件描述符 n2 复制为标准输出(或 fd n1)。 fd n2。

[n]<&-      关闭标准输入(或 n)。

[n1]>&n2    将文件描述符 n2 复制为标准输入(或 fd n1)。 fd n2。

[n]>&-      关闭标准输出(或 n)。

[n]<> 文件  为标准输入(或 n)打开文件以进行读取和写入。

以下重定向通常称为“here-document”。

[n]<< 分隔符
here-doc-text ...
分隔符

直到分隔符的所有后续行上的文本都会被保存起来,并作为标准输入或文件描述符 n(如果已指定)提供给命令。 如果在初始行上指定的分隔符是带引号的,则 here-doc-text 将被视为字面文本;否则,文本将受到参数扩展、命令替换和算术扩展的影响(如“扩展”部分所述)。 如果运算符是“<<-”而不是“<<”,则 here-doc-text 中的前导制表符将被删除。

搜索与执行

存在三种类型的命令:shell 函数、内置命令和普通程序——命令按此顺序进行搜索(按名称)。它们各自以不同的方式执行。

当执行 shell 函数时,所有 shell 的位置参数(除了 $0,它保持不变)都会设置为 shell 函数的参数。通过在函数名称之前放置对变量的赋值,显式地将这些变量放置在命令的环境中,这些变量将变为函数的局部变量,并设置为给定的值。然后,执行函数定义中给定的命令。命令完成后,位置参数将被恢复到其原始值。所有这些都发生在当前的 shell 中。

shell 内置命令在 shell 内部执行,无需生成新的进程。

否则,如果命令名称与任何函数或内置命令都不匹配,则命令将作为文件系统中的普通程序进行搜索(如下一节所述)。当执行普通程序时,shell 会运行该程序,并将参数和环境传递给该程序。如果该程序不是普通的的可执行文件(即,如果它不以“魔数”开头,其 ASCII 形式为“#!”,则 execve(2) 返回 ENOEXEC),则 shell 将在子 shell 中解释该程序。在这种情况下,子 shell 将重新初始化自身,因此效果将类似于调用一个新的 shell 来处理临时 shell 脚本,但父 shell 中哈希命令的位置将由子 shell 记住。

请注意,此文档的先前版本以及源代码本身都会误导性和零星地将没有魔数的 shell 脚本称为“shell 过程”。

路径搜索

在定位命令时,shell 首先查找是否存在具有该名称的 shell 函数。然后,它查找具有该名称的内置命令。如果没有找到内置命令,则会发生以下两种情况之一:

  包含斜杠的命令名称将直接执行,无需执行任何搜索。

  shell 会依次搜索 PATH 变量中的每个条目,以查找该命令。PATH 变量的值应该是由冒号分隔的一系列条目。每个条目都由一个目录名组成。当前目录可以由一个空目录名或显式地由一个单独的点来指示。

命令退出状态

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


如果一个命令完全由变量赋值组成,则该命令的退出状态是最后一个命令替换的退出状态(如果有的话),否则为 0。

复合命令

复合命令是由控制操作符或保留字组合而成的简单命令,从而形成更大的复合命令。更广义地说,命令是以下之一: 简单命令 管道 列表或复合列表 复合命令 函数定义

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

管道

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

管道的格式如下: [!] command1 [| command2 ...]

command1 的标准输出连接到 command2 的标准输入。在管道中,命令的标准输入、标准输出或两者都被认为是已分配的,然后再应用由重定向操作符指定的任何重定向。

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

如果当 shell 开始执行管道时启用了 pipefail 选项,则管道的退出状态是管道中指定的最后一个退出状态非零的命令的退出状态,或者如果管道中的所有命令都以状态零退出,则为零。如果未启用 pipefail 选项,则管道的退出状态是管道中指定的最后一个命令的退出状态;其他任何命令的退出状态都不使用。如果保留字 ! 位于管道之前,则其退出状态是上述退出状态的逻辑非。

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

$ command1 2>&1 | command2

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

^ ` 或换行符终止符会导致执行先前的 AND-OR 列表(如下所述);&` 导致异步执行先前的 AND-OR 列表。

请注意,与其他一些 shell 不同,管道中的每个进程都是调用 shell 的子进程(除非它是 shell 内置命令,在这种情况下,它在当前 shell 中执行——但它对环境的任何影响都会被清除)。

后台命令 – &

如果命令以控制操作符 & 结尾,则 shell 将异步执行该命令——也就是说,shell 不会在执行下一个命令之前等待命令完成。

在后台运行命令的格式如下:


command1 & [command2 & ...]

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

列表 – 一般来说

列表是一个或多个命令的序列,这些命令由换行符、分号或 & 符号分隔,并且可以选择性地以这三个字符中的一个结尾。 列表中的命令按照它们编写的顺序执行。 如果命令后跟一个 & 符号,则 shell 会启动该命令并立即继续执行下一个命令;否则,它会等待该命令终止后再继续执行下一个命令。

短路列表运算符

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

流控制结构 – if、while、for、case

^ f 命令的语法是

if list
then list
[ elif list
then    list ] ...
[ else list ]
fi

^ hile 命令的语法是

while list
do   list
done

这两个列表会重复执行,直到第一个列表的退出状态为零。 until 命令类似,但使用 until 替换 while,这会导致它重复执行,直到第一个列表的退出状态为零。

^ or 命令的语法是

for variable [ in [ word ... ] ]
do   list
done

^ n 之后的单词会被扩展,然后列表会重复执行,变量设置为每个单词。 省略 in word ... 等效于 in "$@"

^ reakcontinue 命令的语法是

break [ num ]
continue [ num ]

^ reak 终止 num 个最内层的 forwhile 循环。 continue 继续执行最内层循环的下一个迭代。 这些作为内置命令实现。

^ ase 命令的语法是

case word in
[(]pattern) list ;;
...
esac

模式实际上可以是多个模式(参见“Shell 模式”,稍后描述),由“|”字符分隔。 模式前的“(”字符是可选的。

将命令组合在一起

可以通过以下方式组合命令:

(list)

或者

{ list; }

第一种方法在子 shell 中执行命令。 组合到 (list) 中的内置命令不会影响当前 shell。 第二种形式不会 fork 另一个 shell,因此效率略高。 以这种方式将命令组合在一起,可以将它们的输出重定向,就像它们是一个程序一样:

{ printf " hello " ; printf " world\n" ; } > greeting

请注意,“}”必须跟在一个控制运算符(此处为“;”)之后,以便将其识别为保留字,而不是另一个命令参数。

函数

函数定义的语法是

name () command

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

可以使用 local 命令声明变量为函数的局部变量。这应该作为函数的第一条语句出现,语法如下:

local [变量 | -] ...

^ ocal 命令作为一个内置命令实现。

当一个变量被声明为局部变量时,它会继承其在周围作用域中具有相同名称的变量的初始值以及导出和只读标志(如果存在)。否则,该变量最初未设置。Shell 使用动态作用域,因此,如果您将变量 x 声明为函数 f 的局部变量,并且函数 f 调用函数 g,则在 g 内部对变量 x 的引用将引用在 f 中声明的变量 x,而不是全局变量 x

唯一可以声明为局部变量的特殊参数是 "-"。声明 "-" 为局部变量后,任何通过 set 命令在函数内部更改的 shell 选项都将在函数返回时恢复到其原始值。

^ eturn 命令的语法如下:

return [退出状态]

它终止当前正在执行的函数。return 命令作为一个内置命令实现。

变量和参数

Shell 维护一组参数。以名称表示的参数称为变量。在启动时,Shell 将所有环境变量转换为 Shell 变量。可以使用以下形式设置新的变量:

name=value

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

位置参数

位置参数是由数字 (n > 0) 表示的参数。Shell 最初将它们设置为 Shell 脚本名称后面的命令行参数的值。也可以使用内置命令 set 来设置或重置它们。

特殊参数

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

*            扩展为位置参数,从第一个参数开始。当扩展发生在双引号字符串内时,它扩展为一个字段,其中每个参数的值由 `IFS` 变量的第一个字符或空格分隔(如果 `IFS` 未设置)。

@            扩展为位置参数,从第一个参数开始。当扩展发生在双引号内时,每个位置参数都扩展为一个单独的参数。如果没有位置参数,`@` 的扩展将生成零个参数,即使 `@` 被双引号括起来也是如此。这意味着,例如,如果 `$1` 是“abc”,并且 `$2` 是“def ghi”,则 `"$@"` 扩展为两个参数:
"abc" "def ghi"

扩展为位置参数的数量。


?           扩展为最近一个管道的退出状态。

-(连字符。)扩展为在调用时、通过 `set` 内置命令或由 shell 隐式指定的当前选项标志(将单字母选项名称连接成一个字符串)。

$           扩展为所调用 shell 的进程 ID。子 shell 保持与父 shell 相同的 $ 值。

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

0(零。)扩展为 shell 或 shell 脚本的名称。

单词扩展

本条款描述了对单词执行的各种扩展。并非对每个单词都执行所有扩展,如下面所述。

在单个单词中发生的波浪线扩展、参数扩展、命令替换、算术扩展和引号删除都会扩展为一个字段。只有字段拆分或路径名扩展才能从单个单词创建多个字段。此规则的唯一例外是在双引号内扩展特殊参数 @,如上所述。

单词扩展的顺序是:

    波浪线扩展、参数扩展、命令替换、算术扩展(这些同时发生)。

    对步骤 (1) 生成的字段执行字段拆分,除非 IFS 变量为空。

    路径名扩展(除非设置了 `set -f`)。

    引号删除。

$ 字符用于引入参数扩展、命令替换或算术计算。

波浪线扩展(替换用户的家目录)

以未引号的波浪线字符 (~) 开头的单词会进行波浪线扩展。到斜杠 (/) 或单词结尾的所有字符都被视为用户名,并替换为用户的家目录。如果缺少用户名(如 ~/foobar),则波浪线将替换为 HOME 变量的值(当前用户的家目录)。

参数扩展

参数扩展的格式如下:

${表达式}

其中表达式由所有字符组成,直到匹配的“}”。任何通过反斜杠或在引号字符串中转义的“}”,以及嵌入算术扩展、命令替换和变量扩展中的字符,都不会在确定匹配的“}”时进行检查。

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

${参数}

如果参数有值,则替换该值。

参数名称或符号可以包含在大括号中,这对于具有多个数字的位置参数或参数后跟可能被解释为该名称一部分的字符时是必需的。如果在双引号内发生参数扩展:

    不针对扩展结果执行路径名扩展。

字段拆分不会对扩展的结果进行操作,除了 @ 之外。

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

${parameter:-word}    使用默认值。如果参数未设置或为空,则替换为 word 的扩展;否则,替换为参数的值。

${parameter:=word}    分配默认值。如果参数未设置或为空,则将 word 的扩展分配给参数。在所有情况下,参数的最终值都会被替换。只有变量,而不是位置参数或特殊参数,才能这样分配。

${parameter:?[word]}  如果参数为空或未设置,则指示错误。如果参数未设置或为空,则将 word 的扩展(或者如果省略了 word,则为指示其未设置的消息)写入标准错误,并且 shell 以非零退出状态退出。否则,替换为参数的值。交互式 shell 不一定退出。

${parameter:+word}    使用替代值。如果参数未设置或为空,则替换为空;否则,替换为 word 的扩展。

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

${#parameter}         字符串长度。参数的值的字符长度。

以下四种参数扩展提供了子字符串处理。在每种情况下,都使用 shell 模式符号(参见“Shell 模式”),而不是正则表达式符号来评估模式。如果参数为 * 或 @,则扩展结果未指定。将完整的参数扩展字符串括在双引号中不会导致以下四种模式字符被引用,而将字符括在花括号中则会这样做。

${parameter%word}     删除最小后缀模式。word 扩展以生成模式。然后,参数扩展的结果为参数,删除了与模式匹配的最小后缀部分。

${parameter%%word}    删除最大后缀模式。word 扩展以生成模式。然后,参数扩展的结果为参数,删除了与模式匹配的最大后缀部分。

${parameter#word}     删除最小前缀模式。word 扩展以生成模式。然后,参数扩展的结果为参数,删除了与模式匹配的最小前缀部分。

${parameter##word}    删除最大前缀模式。word 扩展以生成模式。然后,参数扩展的结果为参数,删除了与模式匹配的最大前缀部分。

命令替换

命令替换允许将命令的输出替换为命令名本身。当命令如下括起来时,会发生命令替换:


$(command)

或者(使用“反引号”):

\`command\`

Shell 通过在一个子 shell 环境中执行命令并用命令的标准输出来替换命令替换来扩展命令替换,并移除替换结尾处一个或多个换行符的序列。(嵌入在输出结尾之前的换行符不会被移除;但是,在字段分割期间,它们可能会被转换为空格,具体取决于 IFS 的值和生效的引号。)

算术扩展

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

$((expression))

表达式的处理方式就像它被放在双引号中一样,除了表达式中的双引号不会被特殊处理。Shell 扩展表达式中的所有标记,用于参数扩展、命令替换和引号删除。

接下来,shell 将其视为算术表达式,并用表达式的值进行替换。

空格分割(字段分割)

在参数扩展、命令替换和算术扩展之后,shell 扫描那些没有在双引号中发生的扩展和替换的结果,以进行字段分割,并且可能会产生多个字段。

Shell 将 IFS 中的每个字符都视为分隔符,并使用这些分隔符将参数扩展和命令替换的结果分割成字段。

文件名扩展(文件名生成)

除非设置了 -f 标志,否则文件名生成是在完成词分割之后执行的。 每个词都被视为一系列由斜杠分隔的模式。扩展过程将该词替换为所有可以由将每个模式替换为匹配指定模式的字符串而形成的文件名的文件名。有两个限制:首先,模式不能匹配包含斜杠的字符串,其次,模式不能匹配以句点开头的字符串,除非模式的第一个字符是句点。下一节描述了用于文件名扩展和 case 命令的模式。

Shell 模式

模式由普通字符和元字符组成,普通字符匹配自身。元字符是“!”、“*”、“?”和“[”。如果这些字符被引用,则它们将失去其特殊含义。当执行命令或变量替换并且美元符号或反引号未被双引号引用时,变量的值或命令的输出将被扫描这些字符,并将它们转换为元字符。

星号(“*”)匹配任何字符序列。问号匹配任何单个字符。左括号(“[”)引入一个字符类。字符类的结尾由右括号(“]”)指示;如果缺少右括号,则“[”将匹配“[”而不是引入字符类。字符类匹配方括号之间的任何字符。可以使用减号指定字符范围。通过使感叹号成为字符类的第一个字符来对字符类进行补充。

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

内置命令

本节列出了内置命令,这些命令之所以是内置的,是因为它们需要执行一些不能由单独进程执行的操作。除了这些之外,还有其他一些命令也可能是为了提高效率而内置的(例如 printf(1)、echo(1)、test(1) 等)。

:

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

false 一个返回 1(假)退出值的空命令。

. 文件

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

alias [name[=string ...]]

如果指定 name=string,则 shell 将定义别名 name,其值为 string。如果仅指定 name,则将打印别名 name 的值。如果没有参数,则内置的 alias 命令将打印所有已定义别名的名称和值(请参阅 unalias)。

bg [job] ...

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

command [-p] [-v] [-V] command [arg ...]

执行指定的命令,但在搜索命令时忽略 shell 函数。(当您有一个与内置命令同名的 shell 函数时,这将很有用。)

-p 使用一个 PATH 搜索命令,该 PATH 保证可以找到所有标准实用程序。

-V 不要执行该命令,但搜索该命令并打印命令搜索的解析结果。这与 type 内置命令相同。

-v 不要执行该命令,但搜索该命令并打印实用程序的绝对路径名、内置命令的名称或别名的扩展。

cd|chdir cd|chdir [-LP] [directory]

切换到指定的目录(默认 HOME)。如果在 cd 命令的环境中或 shell 变量 CDPATH 中出现 CDPATH 条目,并且目录名不以斜杠开头,则将搜索 CDPATH 中列出的目录以查找指定的目录。CDPATH 的格式与 PATH 相同。如果指定单个连字符作为参数,则将其替换为 OLDPWD 的值。如果 cd 命令实际切换到的目录与用户给定的目录不同,则 cd 命令将打印它实际切换到的目录的名称。这些可能不同,原因可能是使用了 CDPATH 机制,或者因为参数是单个连字符。-P 选项导致使用物理目录结构,即所有符号链接都解析为其各自的值。-L 选项会关闭任何先前 -P 选项的效果。


echo [-n] args...

将参数打印到标准输出,参数之间用空格分隔。除非存在 -n 选项,否则在参数之后输出一个换行符。

如果在输出过程中遇到以下字符序列,则不会输出该序列,而是执行指定的动作:

\b      输出一个退格字符。

\c      后续输出将被抑制。通常在最后一个参数的末尾使用,以抑制 echo 否则会输出的尾随换行符。

\e      输出一个转义字符(ESC)。

\f      输出一个换页符。

\n      输出一个换行字符。

\r      输出一个回车符。

\t      输出一个(水平)制表符。

\v      输出一个垂直制表符。

\0digits

输出一个字符,其值由零到三个八进制数字表示。如果数字为零,则输出一个空字符。

\\      输出一个反斜杠。

所有其他反斜杠序列都会导致未定义的行为。

eval string ...

将所有参数连接起来,用空格分隔。然后重新解析并执行该命令。

exec [command arg ...]

除非省略 command,否则使用指定的程序替换 shell 进程(该程序必须是实际程序,而不是 shell 内置命令或函数)。exec 命令中的任何重定向都标记为永久性的,因此在 exec 命令完成时不会撤销它们。

exit [exitstatus]

终止 shell 进程。如果提供了 exitstatus,则将其用作 shell 的退出状态;否则,使用前一个命令的退出状态。

export name ...

export -p

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

export name=value

如果没有参数,则 export 命令会列出所有已导出变量的名称。如果指定了 -p 选项,则输出将以适合非交互式使用的格式进行格式化。

fc [-e editor] [first [last]]

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

fc -s [old=new] [first]

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

-e editor

使用由 editor 指定的编辑器来编辑命令。编辑器字符串是一个命令名,受 PATH 变量的约束。如果未指定 -e,则使用 FCEDIT 变量中的值作为默认值。如果 FCEDIT 为空或未设置,则使用 EDITOR 变量中的值。如果 EDITOR 为空或未设置,则使用 ed(1) 作为编辑器。

-l (ell)

列出命令,而不是调用编辑器来处理它们。命令将按 first 和 last 操作数指示的顺序写入,受 -r 的影响,每个命令前面都有命令编号。


-n     在用 -l 选项列出时,禁止显示命令编号。

-r     反转列出的命令顺序(使用 -l 选项),或反转编辑的命令顺序(既不使用 -l 也不使用 -s 选项)。

-s     重新执行命令,无需调用编辑器。

first

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

[+]number
一个正数,表示命令编号;可以使用 -l 选项显示命令编号。

-number
一个负十进制数,表示之前执行的命令编号。例如,-1 是立即之前的命令。

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

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

FCEDIT    要使用的编辑器的名称。

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

fg [job]
将指定的作业或当前作业移到前台。

getopts optstring var [arg ...]
POSIX getopts 命令,不要与贝尔实验室衍生的 getopt(1) 混淆。

第一个参数应该是字母序列,每个字母都可以选择性地后跟一个冒号,以指示该选项需要一个参数。指定的变量设置为解析后的选项。

getopts 命令弃用了较旧的 getopt(1) 实用程序,因为它处理包含空格的参数的方式不同。

getopts 内置命令可用于从参数列表中获取选项及其参数。 调用时,getopts 会将选项字符串中的下一个选项的值放入指定的 shell 变量 var 中,并将其索引放入 shell 变量 OPTIND 中。 启动 shell 时,OPTIND 初始化为 1。 对于需要参数的每个选项,getopts 内置命令都将其放入 shell 变量 OPTARG 中。 如果选项未在 optstring 中允许,则 OPTARG 将被取消设置。

默认情况下,检查变量 $1,...,$n;如果指定了 args,则将解析它们。

optstring 是一个包含已识别选项字母的字符串(请参阅 getopt(3))。 如果某个字母后跟一个冒号,则该选项预计需要一个参数,该参数可能与该选项之间用空格分隔或不用空格分隔。 如果在预期的位置未找到选项字符,getopts 会将变量 var 设置为“?”;然后,getopts 将取消设置 OPTARG 并将输出写入标准错误。 通过将冒号指定为 optstring 的第一个字符,将忽略所有错误。

在最后一个选项之后,getopts 将返回一个非零值,并将 var 设置为“?”。

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

while getopts abc: f
do
case $f in
a | b)  flag=$f;;
c)      carg=$OPTARG;;
\?)     echo $USAGE; exit 1;;
esac
done
shift $((OPTIND - 1))

此代码将接受以下任何一种形式,并且它们等效:

cmd -acarg file file
cmd -a -c arg file file
cmd -carg -a file file
cmd -a -carg -- file file
hash [command ...]

hash -r

Shell 维护一个哈希表,用于记录命令的位置。如果没有提供任何参数,hash 命令将打印哈希表的内容。自上次 cd 命令以来未访问过的条目将用星号标记;这些条目可能无效。

如果提供参数,hash 命令将从哈希表中删除指定的命令(除非它们是函数),然后定位它们。-r 选项将导致 hash 命令删除哈希表中的所有条目,但保留函数。

jobs [-lp] [job ...]

显示所有或指定作业的状态:

默认情况下,显示作业编号、当前状态(+ 或 -)、作业状态及其 shell 命令。 ^ l 选项还会输出组领导者的 PID,以及其他成员的 PID 和 shell 命令。 ^ p 选项仅显示组领导者的 PID,每行一个。

kill [-s sigspec | -signum | -sigspec] [pid | job ...]

等效于 kill(1),但也可以指定作业。信号可以是大小写不敏感的名称,无需 SIG 前缀,也可以是十进制数字;默认值为 TERM

kill -l [signum | exitstatus]

列出可用的信号名称,不带 SIG 前缀(sigspecs)。如果指定了 signum,则仅显示该信号的 sigspec。如果指定了 exitstatus(> 128),则仅显示导致该退出状态的 sigspec

pwd [-LP]

内置命令会记住当前目录,而不是每次都重新计算。这使其速度更快。但是,如果当前目录被重命名,则 pwd 的内置版本将继续打印目录的旧名称。-P 选项导致显示当前工作目录的物理值,即,所有符号链接都将解析为各自的值。-L 选项会取消任何先前的 -P 选项的效果。

read [-p prompt] [-r] variable [...]

如果指定了 -p 选项并且标准输入是终端,则会打印提示符。然后,从标准输入读取一行。删除该行末尾的换行符,并如上面“单词分割”部分所述对该行进行分割,然后按顺序将各个部分分配给变量。必须指定至少一个变量。如果片段的数量大于变量的数量,则剩余的片段(以及分隔它们的 IFS 字符)将被分配给最后一个变量。如果变量的数量大于片段的数量,则剩余的变量将被分配空字符串。read 内置命令将指示成功,除非在输入中遇到 EOF,在这种情况下,将返回失败。


默认情况下,除非指定了 -r 选项,否则反斜杠“\”充当转义字符,导致下一个字符按字面意思处理。如果反斜杠后跟一个换行符,则该反斜杠和换行符将被删除。

readonly name ...

readonly -p

指定的名称被标记为只读,因此之后不能再修改或取消设置。 shell 允许在设置变量值的同时将其标记为只读,方法是写入

readonly name=value

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

printf format [value]...
printf 根据 format 格式化并打印其参数,format 是一个字符字符串,其中包含三种类型的对象:普通字符,这些字符直接复制到标准输出;字符转义序列,这些序列将被转换并复制到标准输出;以及格式说明符,每个格式说明符都会导致打印下一个连续的值。

如果相应的格式说明符是 b、c 或 s,则每个值都将被视为字符串;否则,它将被评估为 C 语言常量,并进行以下补充: 允许使用前导加号或减号。 如果前导字符是单引号或双引号,则该值为下一个字节的值。

格式字符串会尽可能多地重复使用,直到所有值都被处理完毕。 任何额外的格式说明符都将使用零或空字符串进行评估。

字符转义序列采用反斜杠符号,如 ANSI X3.159-1989(“ANSI C89”)中定义。 字符及其含义如下:

\a      写入一个 <bell> 字符。

\b      写入一个 <backspace> 字符。

\e      写入一个 <escape> (ESC) 字符。

\f      写入一个 <form-feed> 字符。

\n      写入一个 <new-line> 字符。

\r      写入一个 <carriage return> 字符。

\t      写入一个 <tab> 字符。

\v      写入一个 <vertical tab> 字符。

\\      写入一个反斜杠字符。

\num    写入一个 8 位字符,其 ASCII 值为 1 位、2 位或 3 位八进制数 num。

每个格式说明符以百分号('%')字符开头。 格式说明符的其余部分包括以下内容,顺序如下:

零个或多个以下标志:

#       一个“#”字符,指定应以“替代形式”打印该值。 对于 b、c、d 和 s 格式,此选项无效。

对于 o 格式,数字的精度增加到 1,以强制输出字符串的第一个字符为零。 对于 x (X) 格式,非零结果将在其前面添加字符串 0x (0X)。 对于 e、E、f、g 和 G 格式,结果始终包含一个小数点,即使小数点后面没有数字(通常,这些格式的结果只有在小数点后有数字时才会显示小数点)。 对于 g 和 G 格式,结果中不会删除尾随零,否则尾随零将被删除。


-       一个减号 `-',用于指定输出在指示字段中的左对齐;

+       一个 `+' 字符,用于指定在对有符号格式使用时,始终在数字前放置一个符号。

‘ ’     一个空格,用于指定在有符号格式中,在正数前留一个空格。如果同时使用 `+` 和空格,`+` 将覆盖空格;

0      一个零 `0` 字符,指示应使用零填充而不是空格填充。如果同时使用 `-'` 和 `0`,则 `-'` 将覆盖 `0`;

字段宽度: 一个可选的数字字符串,用于指定字段宽度;如果输出字符串的字符数少于字段宽度,它将在左侧(或右侧,如果已给出左对齐指示符)用空格填充,以达到字段宽度(请注意,前导零是一个标志,但嵌入的零是字段宽度的一部分);

精度:
一个可选的句点 `.`,后跟一个可选的数字字符串,用于给出精度,该精度指定在小数点的后显示多少位数字,用于 e 和 f 格式,或者指定从字符串打印的最大字节数(b 和 s 格式);如果缺少数字字符串,则精度将被视为零;

格式:
一个字符,指示要使用的格式类型(diouxXfwEgGbcs之一)。

字段宽度或精度可以是 `*` 而不是数字字符串。在这种情况下,一个参数将提供字段宽度或精度。

格式字符及其含义:

diouXx      参数作为带符号十进制(d 或 i)、无符号八进制、无符号十进制或无符号十六进制(X 或 x)打印。

f           参数以 `[-]ddd.ddd` 样式打印,其中小数点后的 `d` 的数量等于参数的精度规范。如果缺少精度,则给出 6 位数字;如果精度显式设置为 0,则不打印任何数字或小数点。

eE          参数以 `[-]d.ddde±dd` 样式打印,其中小数点前有一个数字,其后数字等于参数的精度规范;当缺少精度时,将生成 6 位数字。使用大写 `E` 表示 `E` 格式。

gG          参数以 f 样式或 e(E)样式打印,具体取决于哪种样式可以在最少的空间内提供完整的精度。

b           字符串参数中的字符将打印,并扩展反斜杠转义序列。支持以下其他反斜杠转义序列:

\c      导致 dash 忽略包含它的字符串操作数中的任何剩余字符、任何剩余的字符串操作数以及格式操作数中的任何附加字符。

\0num   编写一个 8 位字符,其 ASCII 值为 1 位、2 位或 3 位数字的八进制数 num。

c           打印参数的第一个字符。

s           打印字符串参数中的字符,直到到达结尾或达到精度规范中指示的字节数;如果省略精度,则打印字符串中的所有字符。

%           打印一个“%;不使用任何参数。

在任何情况下,不存在或较小的字段宽度都不会导致字段截断;只有当指定的字段宽度超过实际宽度时,才会进行填充。

set [{ -options | +options | -- }] arg ...

set 命令执行三个不同的函数。

如果没有提供参数,它会列出所有 shell 变量的值。

如果提供了选项,它会设置指定的选项标志,或者如“参数列表处理”部分所述,清除它们。 作为一种特殊情况,如果选项是 -o 或 +o 并且没有提供参数,则 shell 会打印所有选项的设置。 如果选项是 -o,则以人类可读的格式打印设置;如果选项是 +o,则以适合重新输入到 shell 以影响相同选项设置的格式打印设置。

除了“参数列表处理”部分中列出的选项名称之外,还可以将以下选项作为 -o 或 +o 的参数指定:

pipefail  从管道中所有命令的退出状态(而不仅仅是最后一个命令)派生管道的退出状态,如“管道”部分所述。

set 命令的第三种用法是设置 shell 的位置参数为指定的参数。 要更改位置参数而不更改任何选项,请使用“--”作为 set 的第一个参数。 如果没有参数,则 set 命令将清除所有位置参数(等效于执行“shift $#”)。

shift [n]

将位置参数移动 n 次。 移动会将 $1 的值设置为 $2 的值,将 $2 的值设置为 $3 的值,依此类推,从而将 $# 的值减少 1。 如果 n 大于位置参数的数量,则 shift 命令将发出错误消息,并以返回状态 2 退出。

test expression

[ expression ]

test 实用程序评估表达式,如果表达式评估为 true,则返回零(true)退出状态;否则,返回 1(false)。 如果没有表达式,test 也会返回 1(false)。

所有运算符和标志都是 test 实用程序的不同参数。

以下基本元素用于构造表达式:

-b file       如果文件存在并且是块特殊文件,则为 true。

-c file       如果文件存在并且是字符特殊文件,则为 true。

-d file       如果文件存在并且是目录,则为 true。

-e file       如果文件存在(无论类型如何),则为 true。

-f file       如果文件存在并且是普通文件,则为 true。

-g 文件   如果文件存在且其设置了组 ID 标志,则返回 True。

-h 文件   如果文件存在且是符号链接,则返回 True。

-k 文件   如果文件存在且其设置了粘滞位,则返回 True。

-n 字符串  如果字符串的长度不为零,则返回 True。

-p 文件   如果文件是一个命名管道(FIFO),则返回 True。

-r 文件   如果文件存在且可读,则返回 True。

-s 文件   如果文件存在且大小大于零,则返回 True。

-t 文件描述符
如果文件描述符编号为 file_descriptor 的文件已打开,并且与终端关联,则返回 True。

-u 文件   如果文件存在且其设置了用户 ID 标志,则返回 True。

-w 文件   如果文件存在且可写,则返回 True。True 仅表示已打开写入标志。即使此测试指示为 True,如果文件位于只读文件系统上,则该文件不可写。

-x 文件   如果文件存在且可执行,则返回 True。True 仅表示已打开执行标志。如果文件是目录,则 True 表示可以搜索该文件。

-z 字符串  如果字符串的长度为零,则返回 True。

-L 文件   如果文件存在且是符号链接,则返回 True。此运算符是为了与早期版本的程序兼容而保留的。请勿依赖它的存在;请改用 -h。

-O 文件   如果文件存在且其所有者与此进程的有效用户 ID 匹配,则返回 True。

-G 文件   如果文件存在且其组与此进程的有效组 ID 匹配,则返回 True。

-S 文件   如果文件存在且是套接字,则返回 True。

file1 -nt file2
如果 file1 和 file2 都存在,并且 file1 比 file2 更新;或者如果 file1 存在但 file2 不存在,则返回 True。

file1 -ot file2
如果 file1 和 file2 都存在,并且 file1 比 file2 更旧;或者如果 file2 存在但 file1 不存在,则返回 True。

file1 -ef file2
如果 file1 和 file2 都存在并且引用同一个文件,则返回 True。

字符串 如果字符串不是空字符串,则返回 True。

s1 = s2 如果字符串 s1 和 s2 相同,则返回 True。

s1 != s2    如果字符串 s1 和 s2 不相同,则返回 True。

s1 < s2 如果字符串 s1 在基于其字符的 ASCII 值的情况下,先于 s2,则返回 True。

s1 > s2 如果字符串 s1 在基于其字符的 ASCII 值的情况下,晚于 s2,则返回 True。

n1 -eq n2   如果整数 n1 和 n2 在代数上相等,则返回 True。

n1 -ne n2   如果整数 n1 和 n2 在代数上不相等,则返回 True。

n1 -gt n2   如果整数 n1 在代数上大于整数 n2,则返回 True。

n1 -ge n2   如果整数 n1 在代数上大于或等于整数 n2,则返回 True。

n1 -lt n2   如果整数 n1 在代数上小于整数 n2,则返回 True。

n1 -le n2   如果整数 n1 在代数上小于或等于整数 n2,则返回 True。

这些基本表达式可以与以下运算符组合:

! 表达式   如果表达式为 False,则返回 True。

expression1 -a expression2
如果 expression1 和 expression2 都为 True,则返回 True。

expression1 -o expression2
如果 expression1 或 expression2 为 True,则返回 True。

(表达式) 如果表达式为真,则返回真。

-a 运算符的优先级高于 -o 运算符。

times 打印 shell 和从 shell 运行的进程的累积用户时间和系统时间。返回状态为 0。

trap [操作 信号...]
当 shell 接收到任何指定的信号时,对其进行解析并执行操作。信号通过信号编号或信号名称指定。如果信号为 0 或 EXIT,则在 shell 退出时执行该操作。操作可以是空的(''),这将导致指定的信号被忽略。如果操作省略或设置为 '-',则指定的信号将被设置为其默认操作。当 shell 分叉一个子 shell 时,它会将捕获的(但未被忽略的)信号重置为默认操作。trap 命令对 shell 进入时被忽略的信号不起作用。不带任何参数的 trap 命令将以适合作为实现相同捕获结果的 shell 的输入的格式,将信号列表及其关联的操作写入标准输出。

示例:

trap

列出已捕获的信号及其相应的操作

trap '' INT QUIT TSTP USR1

忽略信号 INT、QUIT、TSTP、USR1

trap date INT

在接收到信号 INT 时打印日期

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

ulimit [-H | -S] [-a | -tfdscmlpnvwr [值]]
查询或设置进程上的硬限制或软限制,或设置新的限制。通过以下标志选择硬限制(任何进程都不能违反,并且一旦降低就不能提高)和软限制(导致进程被发出信号,但不一定被杀死,并且可以提高):

-H 设置或查询硬限制

-S 设置或查询软限制。如果未指定 -H 或 -S,则显示软限制或设置两个限制。如果同时指定,则最后一个生效。

然后,通过指定以下任何一个标志来选择要查询或设置的限制:

-a 显示所有当前限制

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

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

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

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

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

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

-l 显示或设置进程可以使用 mlock(2) 锁定的最大内存量(以千字节为单位)

-p          显示或设置用户一次可以拥有的进程数量限制。

-n          显示或设置进程一次可以打开的文件数量限制。

-v          显示或设置进程可以使用的总虚拟内存(以千字节为单位)限制。

-w          显示或设置进程可以拥有的锁总数限制。

-r          显示或设置进程的实时调度优先级限制。

如果未指定这些选项中的任何一个,则显示或设置文件大小限制。如果指定了值,则将限制设置为该值;否则,将显示当前限制。

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

umask [mask]

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

unalias [-a] [name]

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

unset [-fv] name ...

指定的变量和函数将被取消设置并取消导出。如果指定了 -f 或 -v,则分别取消设置相应的函数或变量。如果给定的名称同时对应于变量和函数,并且未提供任何选项,则仅取消设置变量。

wait [job]

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

命令⾏编辑

当 dash 交互式地从终端使用时,可以使用 vi 模式命令行编辑来编辑当前命令和命令历史记录(参见“内置命令”中的 fc)。此模式使用类似于 vi man page 中描述的子集中的命令。set -o vi 命令启用 vi 模式编辑并将 sh 置于 vi 插入模式。在启用 vi 模式的情况下,可以在插入模式和命令模式之间切换。它类似于 vi:键入 ⟨ESC⟩ 进入 vi 命令模式。在命令模式下按 ⟨return⟩ 将把该行传递给 shell。

退出状态

shell 检测到的错误(如语法错误)将导致 shell 以非零退出状态退出。如果 shell 不是交互式 shell,则 shell 文件的执行将被中止。否则,shell 将返回最后执行的命令的退出状态,或者如果使用了带有数字参数的 exit 内置命令,它将返回该参数。

环境

HOME       由 login(1) 从密码文件(passwd(4))中的用户登录目录中自动设置。此环境变量还充当 cd 内置命令的默认参数。

PATH       可执行文件的默认搜索路径。请参见上面的“路径搜索”部分。

CDPATH     与 cd 内置命令一起使用的搜索路径。

MAIL       要检查新邮件是否到达的邮件文件的名称。由 MAILPATH 覆盖。

MAILCHECK  shell 检查 MAILPATH 或 MAIL 文件中是否有新邮件的频率(以秒为单位)。如果设置为 0,则每次提示时都会进行检查。

MAILPATH   一个冒号“:”分隔的文件名列表,shell 将检查这些文件是否有传入邮件。此环境变量会覆盖 MAIL 设置。一次最多可以监视 10 个邮箱。

PS1        主提示符字符串,默认值为“$ ”,除非您是超级用户,在这种情况下,默认值为“# ”。

PS2        辅助提示符字符串,默认值为“> ”。

PS4        启用执行跟踪 (set -x) 时,在每一行之前输出的内容,默认值为“+ ”。

IFS        输入字段分隔符。通常设置为 ⟨空格⟩、⟨制表符⟩和⟨换行符⟩。有关更多详细信息,请参见“空格分隔”部分。

TERM       shell 的默认终端设置。这由 shell 的子进程继承,并用于历史记录编辑模式。

HISTSIZE   shell 历史记录缓冲区中的行数。

PWD        当前工作目录的逻辑值。由 cd 命令设置。

OLDPWD     当前工作目录的先前逻辑值。由 cd 命令设置。

PPID       shell 的父进程的进程 ID。

文件

$HOME/.profile

/etc/profile

参见

csh(1), echo(1), getopt(1), ksh(1), login(1), printf(1), test(1), getopt(3), passwd(5), environ(7), sysctl(8)

历史

dash 是一种符合 POSIX 标准的 /bin/sh 实现,旨在尽可能小。dash 是 NetBSD 版本的 ash(Almquist SHell)的直接后代,于 1997 年初移植到 Linux。它于 2002 年更名为 dash。

错误

应尽可能避免使用 setuid shell 脚本,因为它们存在重大的安全风险。

PS1、PS2 和 PS4 在显示之前应进行参数扩展。