关于 POSIX 2013 中的控制运算符&
和;
:
对于异步列表,
在后台运行命令的格式为:
command1 & [command2 & ... ]
对于顺序列表,
顺序执行命令的格式应为:
command1 [; command2] ...
是
&
一元还是二元?是;
一元还是二元?&
看起来;
像二进制,对前后命令进行操作,表示两个命令之间的执行顺序是并发的还是顺序的。&
看起来像一元,因为异步列表中的每个命令后面都跟着一个&
.;
看起来不像一元,因为顺序列表中的最后一个命令不需要后面的;
.注意:运算符对操作数进行运算。根据操作数的数量,我们可以说运算符是一元的、二元的……。如果我理解正确的话,控制运算符是命令上的运算符。
&
在和的混合列表中;
,组件命令之间的执行顺序是什么?每个&
和;
对于组件命令意味着什么?例如,在 Bash 中
$ echo 1 ; echo 2 & echo 3; echo 4 & echo 5 1 [1] 11089 3 2 [2] 11090 5 4 [1]- Done echo 2 [2]+ Done echo 4 $ echo 1 ; echo 2 & echo 3; echo 4 & echo 5 ; echo 6 & 1 [1] 11100 3 [2] 11101 5 [3] 11102 6 4 2 [1] Done echo 2 [2]- Done echo 4 [3]+ Done echo 6
答案1
我通常不会将他们视为“操作员”。我的意思是,通常运算符会返回值。
&
也;
不要。相反,他们结束陈述。但如果你将它们视为运算符,它们会在单个语句上进行操作,因此我想它们将是后缀一元运算符。它们是从左到右开始的。请注意,在 的情况下
&
,它在后台异步运行:echo 1 & echo 2 & echo 3
可以按任意顺序打印 1、2 和 3(因为即使它们是开始了按顺序,内核可能不会安排它们以便它们按顺序打印)。但echo 1; echo 2; echo 3
始终会按数字顺序打印它们。echo 1; echo 2 & echo 3
总是先打印 1,但 2 和 3 可以是任意顺序。
答案2
要添加到 derobert 的答案,并剖析您问题中包含的命令:
echo 1 ; echo 2 & echo 3; echo 4 & echo 5 ; echo 6 &
这在伪代码中意味着:
print 1 (and complete this step before continuing)
start a process in the background that will eventually print 2,
and keep going as soon as the process has been *started*
print 3 (and complete this before continuing)
start a background process that will eventually print 4,
and keep going as soon as it has started
print 5 (complete this before continuing)
start a background process that will print 6.
另请注意,对 shell 的任何命令都必须终止(无论是使用&
或;
或换行符、文件结尾还是我现在没有想到的其他内容),否则 shell 将不知道何时停止读取更多字符作为一部分该命令实际上跑步命令。
答案3
请注意,bash 具有看起来与命令行的一般情况非常相似的内置命令。我将跳过这方面。
但一般来说,命令行是一系列由特殊标点符号分隔的命令,而不是运算符。
命令是可执行文件的名称(可以通过 PATH 环境变量搜索)。这就是将被执行以执行该命令的程序。
命令后面是空格分隔的字符串,它们作为字符串传递给命令。但是,如果您希望将特殊标点符号作为参数的一部分,则必须对其进行转义(使用\
' 或使用引号)。
标点符号有效果。
特殊的标点符号如“<”、“>”及其同类定义了命令的标准输入输出和错误
'|'终止一个命令并将其标准输出通过管道传输到下一个命令的标准输入
';'执行上一个命令并等待其完成。即在前台运行。
'&' 执行上一个命令,但继续执行命令行进程而不等待完成。即在后台运行。
因此,请注意这些语法标记的目的是让您将这些东西放在一起做类似的事情
echo perl myperlprogram.pl \< mydata.txt | at 12:35
它使用echo
另一个 shell 命令本身生成一个字符串,以执行 perl 程序,并将该字符串发送到at
命令以稍后将其作为批处理作业运行。但请注意, 是<
转义的,因此它作为参数传递给echo
(它将at
作为输入发送给),而不是立即设置标准输入。当批处理系统执行命令字符串THEN时,它将设置perl程序的标准输入。
有一些关于内置命令和括号之类的内容的详细说明,一旦理解了基础知识就可以学习这些内容