我经常在网上看到教程,这些教程将各种命令与不同的符号相连。例如:
command1 | command2
command1 & command2
command1 || command2
command1 && command2
其他人似乎正在将命令连接到文件:
command1 > file1
command1 >> file1
这些是什么东西?他们叫什么?他们在做什么?还有更多吗?
这些被称为shell运算符,是的,它们更多。我将简要概述两个主要类(控制操作符和重定向操作符)中最常见的类,以及它们在bash shell中的工作方式。
在shell命令语言中,是执行控制功能的令牌。
它是以下符号之一:& && ( ) ; ;; <newline> | ||
并|&
以重击。
一个!
是没有控制操作员,但一个保留字。它成为算术表达式内部和测试构造内部的逻辑NOT [求反运算符] (尽管仍然需要空格分隔符)。
;
:无论另一个命令的结果如何,都将在另一个命令完成后再运行一个命令。
command1 ; command2
首先command1
运行,在前台运行,一旦完成,command2
将运行。
不在字符串文字中或某些关键字之后的换行符不等于分号运算符。列表;
分隔简单的命令仍然是一个清单-在shell的语法分析器仍旧必须继续遵循一个简单的命令来读取;
执行前界定简单的命令,而新行可以界定一个完整的命令列表-列表或列表。区别是微妙的,但很复杂:鉴于外壳程序没有在换行符之后读取数据的强制性,换行符标志着外壳程序可以开始评估已经读取的简单命令的点,而;
分号可以不是。
&
:这将在后台运行命令,使您可以继续在同一Shell中工作。
command1 & command2
在这里,command1
在后台command2
启动,并立即在前台运行,而无需等待command1
退出。
之后的换行符command1
是可选的。
&&
:用于构建AND列表,它使您仅在另一个命令成功退出时才运行一个命令。
command1 && command2
在这里,command2
将运行后command1
已经完成,只当command1
是成功的(如果它的退出代码为0)。这两个命令都在前台运行。
这个命令也可以写成
if command1
then command2
else false
fi
或者简单地,if command1; then command2; fi
如果返回状态被忽略。
||
:用于构建OR列表,它仅在另一个命令退出失败时才允许您运行一个命令。
command1 || command2
在这里,command2
仅在command1
失败时运行(如果返回的退出状态不是0)。这两个命令都在前台运行。
这个命令也可以写成
if command1
then true
else command2
fi
或用较短的方式if ! command1; then command2; fi
。
请注意,&&
和||
是左关联的;请参阅外壳程序逻辑运算符&&的优先级,|| 欲获得更多信息。
!
:这是保留字,用作“非”运算符(但必须具有定界符),用于取消命令的返回状态-如果命令返回非零状态,则返回0,如果返回状态0,则返回1 。对于该test
实用程序来说也是一个逻辑非。
! command1
[ ! a = a ]
以及算术表达式中真正的NOT运算符:
$ echo $((!0)) $((!23))
1 0
|
:管道运算符,它将一个命令的输出作为输入传递给另一命令。由管道运算符生成的命令称为管道。
command1 | command2
所打印的任何输出command1
都将作为输入传递command2
。
|&
:这是2>&1 |
bash和zsh的简写。它会将一个命令的标准输出和标准错误传递给另一个命令。
command1 |& command2
;;
仅用于标记案例陈述的结尾。Ksh,bash和zsh还支持;&
解决下一种情况,并且;;&
(在ATT ksh中不支持)继续进行后续的情况测试。
(
并)
用于对命令进行分组并在子shell中启动它们。{
以及对}
命令进行分组,但不要在子shell中启动它们。请参阅此答案以获取有关Shell语法中各种类型的括号,方括号和大括号的讨论。
在shell命令语言中,是执行重定向功能的令牌。它是以下符号之一:
< > >| << >> <& >& <<- <>
这些使您可以控制命令的输入和输出。它们可以出现在简单命令内的任何位置,也可以跟随命令。重定向按照从左到右的顺序显示。
<
:为命令提供输入。
command < file.txt
以上将对command
的内容执行file.txt
。
<>
:与上面相同,但是文件以读写模式打开,而不是只读模式:
command <> file.txt
如果文件不存在,将创建它。
很少使用该运算符,因为命令通常仅从其stdin中读取,尽管在许多特定情况下它可以派上用场。
>
:将命令的输出定向到文件中。
command > out.txt
上面将保存输出command
为out.txt
。如果文件存在,则其内容将被覆盖;如果文件不存在,则将创建它。
此运算符还经常用于选择是将某些内容打印到标准错误还是标准输出中:
command >out.txt 2>error.txt
在上面的示例中,>
将重定向标准输出并2>
重定向标准错误。您也可以使用重定向输出,1>
但由于这是默认设置,因此1
通常会省略并将其写为>
。
因此,运行command
在file.txt
并保存其输出out.txt
和任何错误消息在error.txt
你可以运行:
command < file.txt > out.txt 2> error.txt
>|
:与相同>
,但即使外壳已配置为拒绝覆盖(使用set -C
或set -o noclobber
),也将覆盖目标。
command >| out.txt
如果out.txt
存在,则输出command
将替换其内容。如果不存在,将创建它。
>>
:与相同>
,但如果目标文件存在,则附加新数据。
command >> out.txt
如果out.txt
存在,则command
在其中的任何内容之后,的输出都将附加到它的后面。如果不存在,将创建它。
>&
:(按POSIX规范)当被数字(1>&2
)或-
右侧(1>&-
)包围时,仅重定向一个文件描述符或将其关闭(>&-
)。
一个>&
接着一个文件描述符是重定向文件描述符的便携方式,并且>&-
是可移植的方式来关闭一个文件描述符。
如果此重定向的右侧是文件,请阅读下一个条目。
>&
,&>
,>>&
和&>>
:(读以上也)重定向两个标准误差和标准输出,分别替换或附加,。
command &> out.txt
标准错误和的标准输出都command
将保存在中out.txt
,覆盖其内容,或者如果不存在则创建它。
command &>> out.txt
如上所述,除了如果out.txt
存在的话,输出和错误command
将被附加到它上面。
该&>
变种起源于bash
,而>&
变异来自(几十年前)CSH。它们都与其他POSIX Shell运算符冲突,因此不应在可移植sh
脚本中使用。
<<
:此处文档。它通常用于打印多行字符串。
command << WORD
Text
WORD
在这里,command
直到找到下一个出现将采取一切WORD
,Text
在上面的例子中,作为输入。尽管WORD
通常是EoF
其变体,但它可以是您喜欢的任何字母数字(不仅是)字符串。用WORD
引号引起来时,此处文档中的文本将按字面意义处理,并且不执行任何扩展(例如,对变量进行扩展)。如果未引用,则变量将被扩展。有关更多详细信息,请参见bash手册。
如果要将管道的输出command << WORD ... WORD
直接传送到另一个命令或多个命令中,则必须将管道与放在同一行<< WORD
,您不能将其放在终止WORD后面或后面的行中。例如:
command << WORD | command2 | command3...
Text
WORD
<<<
:此处字符串,类似于此处文档,但用于单行。这些仅存在于Unix端口或rc(它起源于此),zsh,ksh,yash和bash的某些实现中。
command <<< WORD
给出的随WORD
扩展而定,其值作为输入传递给command
。这通常用于将变量的内容作为输入传递给命令。例如:
$ foo="bar"
$ sed 's/a/A/' <<< "$foo"
bAr
# as a short-cut for the standard:
$ printf '%s\n' "$foo" | sed 's/a/A/'
bAr
# or
sed 's/a/A/' << EOF
$foo
EOF
其他一些运算符(>&-
,x>&y
x<&y
)可用于关闭或复制文件描述符。有关它们的详细信息,请参阅您的shell的手册中的相关部分(这里例如对于bash)。
那只涵盖了像Bourne这样的shell的最常见的运算符。一些外壳具有自己的一些其他重定向操作符。
Ksh,bash和zsh也具有<(…)
,>(…)
和=(…)
(zsh
仅后者)。这些不是重定向,而是进程替换。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句