bash 5.2中文修订3

Shell Commands (shell 命令)

简单的 shell 命令(例如 echo a b c )由命令本身组成,后跟参数,参数之间用空格分隔。

更复杂的 shell 命令由以多种方式排列在一起的简单命令组成:一是管道,其中一个命令的输出成为第二个命令的输入;二是在循环或条件结构中;三是某种分组。

Reserved Words 保留字

保留字是对 shell 有特殊含义的字。它们用于shell 的复合命令中,表示开始或者结束。

以下单词在未加引号并且是命令的第一个字时被识别为保留字(请参阅下面的例外情况):

if then elif else fi time
for in until while do done
case esac coproc select function
{ } [[ ]] !
如果 in 是 case 或 select 命令的第三个字,则将其识别为保留字。如果 in 和 do 是 for 命令中的第三个字,则它们被识别为保留字。

Simple Commands简单命令

简单命令是最常遇到的命令。它只是一个由空白符(blank)分隔的单词序列,由 shell 的一个控制运算符终止(请参阅 Definitions )。第一个单词通常指定要执行的命令,其余单词是该命令的参数。

简单命令的返回状态(请参阅 Exit Status )是 POSIX 1003.1 waitpid 函数提供的退出状态,或者如果命令由信号 n 终止,则为 128+ n 。

Pipelines 管道

pipeline 是由控制运算符 ’|’ 或者 '|&’.之一分隔的一个或多个命令的序列

管道的格式是:
[time [-p]] [!] command1 [ | or |& command2 ] …

管道中每个命令的输出通过管道连接到下一个命令的输入。也就是说,每个命令都会读取前一个命令的输出。此连接在 command1 指定的任何重定向之前执行。

如果使用的是 ‘|&', command1 的标准错误除了其标准输出外,还通过管道连接到 command2 的标准输入;它是 2>&1 | 的简写。将标准错误隐式重定向到标准输出是在 command1 指定的任何重定向之后执行的。

保留字 time 会输出在管道完成后执行时间的统计信息。当前的统计信息包括花费的(钟表)总时间以及命令执行所消耗的用户和系统时间。-p选项将输出格式更改为 POSIX 指定的格式。当 shell 处于 POSIX 模式时(请参阅 Bash POSIX Mode ),如果下一个标记以 ‘-’ 开头,它不会将 time 识别为保留字。 TIMEFORMAT 变量可以设置为指定如何显示计时信息的格式字符串。有关可用格式的说明,请参阅 Bash Variables 。作为保留字的time允许我们为 shell 内建命令、shell 函数和管道的计时。这是外部命令time(/usr/bin/time)无法轻松完成的。

当 shell 处于 POSIX 模式时(请参阅 Bash POSIX Mode ), time 后面可能会跟有换行符。在这种情况下,shell 显示 shell 及其子shell
消耗的总用户时间和系统时间。 TIMEFORMAT 变量可用于指定时间信息的格式。

如果管道不是异步执行的(请参阅 Lists of Commands ),则 shell 会等待管道中的所有命令完成。

创建管道的多个命令,每个命令都在其子 shell 中执行,该子 shell 是一个单独的进程(请参阅 Command Execution Environment )。如果使用 shopt 内置函数启用 lastpipe 选项(请参阅 The Shopt Builtin ),则当作业控制未激活时,管道的最后一个元素可能由当前shell 进程运行。
内置函数lastpipe演示:在子shell中定义的变量是无法在当前shell查看的。
gyj@DESKTOP-S52KD5S:~$ echo asd | var= ( c a t ) g y j @ D E S K T O P − S 52 K D 5 S :   (cat) gyj@DESKTOP-S52KD5S:~ (cat)gyj@DESKTOPS52KD5S:  echo $asd

gyj@DESKTOP-S52KD5S:~$ set +m #关闭作业控制
gyj@DESKTOP-S52KD5S:~$ shopt -s lastpipe #启用lastpipe
gyj@DESKTOP-S52KD5S:~$ echo zxc | var1= ( c a t ) g y j @ D E S K T O P − S 52 K D 5 S :   (cat) gyj@DESKTOP-S52KD5S:~ (cat)gyj@DESKTOPS52KD5S:  echo $var1
zxc

管道的退出状态是管道中最后一个命令的退出状态,除非启用了 pipefail 选项(请参阅 The Set Builtin )。如果启用 pipefail ,则管道的返回状态是最后一个(最右边)以非零状态退出的命令的值,如果所有命令成功退出,则返回零。如果保留字 ‘!’ 在管道之前,退出状态是上述退出状态的逻辑非。shell 在等待管道中的所有命令终止之后返回一个值。

list 命令列表

list 是由运算符’;’(分号), ‘&’(后台), ‘&&'(AND),或者 ‘||’(或)及 ‘|‘ (管道)分隔的一个或多个的命令组合,并可选择由 ‘;’(分号), ‘&’(后台),或 newline(换行)之一结束。

在这些列表运算符中,‘&&’ 和 ‘||’ 具有同等优先级,后跟 ‘;’ 和 ‘&’,具有相同的优先级。

list 中可能会出现一系列一个或多个换行符来分隔命令,相当于分号。

如果命令使用控制操作符 ‘&’ 终止,shell 在子 shell 中异步执行命令。这称为在后台执行命令,这些在后台执行的命令称为异步命令。shell 不会等待后台命令完成,直接返回一个返回状态为 0 (true)返回码。当作业控制未激活时(请参阅 Job Control ),在没有任何显式重定向的情况下,异步命令的标准输入将从 /dev/null 重定向。

命令由 ‘;’ (分号)分隔时依次执行;shell 依次等待每个命令终止。返回状态是最后执行的命令的退出状态。

AND 和 OR 列表是由控制运算符 ’ &&’ 和 '||'分隔的一个或多个管道的序列,AND 和 OR 列表以左结合方式执行。

AND 列表的形式为
command1 && command2

当且仅当 command1 返回退出状态为零(成功)时, command2 才会执行。

OR 列表的形式为
command1 || command2

当且仅当 command1 返回非零退出状态时, command2 才会执行。

AND 和 OR 列表的返回状态是列表中最后执行的命令的退出状态。

你可能感兴趣的:(bash,开发语言)