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@DESKTOP−S52KD5S: 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@DESKTOP−S52KD5S: 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 列表的返回状态是列表中最后执行的命令的退出状态。

相关推荐
LDR00616 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术16 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript
码云数智-园园16 天前
C++20 Modules 模块详解
java·开发语言·spring
swordbob16 天前
NIO的channel中什么是 fd(File Descriptor,文件描述符)
java·开发语言·nio
源分享16 天前
Java线程同步的多种实现方法(非常详细)
java·开发语言·jvm
Luminous.16 天前
C语言--day30
c语言·开发语言
何以解忧,唯有..16 天前
Go语言循环语句详解:for、range与循环控制
开发语言·算法·golang
謓泽16 天前
C语言不是语法,是通往机器的地图。
c语言·开发语言
云水一下16 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php
飞天狗11116 天前
零基础JavaWeb入门——第五课第二小节:九大内置对象 · 第2个:response(响应对象)
java·开发语言