Shell的控制和重定向运算符是什么?

芒登

我经常在网上看到教程,这些教程将各种命令与不同的符号相连。例如:

command1 |  command2
command1 &  command2
command1 || command2    
command1 && command2

其他人似乎正在将命令连接到文件:

command1  > file1
command1  >> file1

这些是什么东西?他们叫什么?他们在做什么?还有更多吗?


有关此问题的元线程。

芒登

这些被称为shell运算符,是的,它们更多。我将简要概述两个主要类(控制操作符重定向操作符)中最常见的类,以及它们在bash shell中的工作方式。

A.控制操作员

POSIX定义

在shell命令语言中,是执行控制功能的令牌。
它是以下符号之一:

&   &&   (   )   ;   ;;   <newline>   |   ||

|&以重击。

一个!没有控制操作员,但一个保留字它成为算术表达式内部和测试构造内部的逻辑NOT [求反运算符] (尽管仍然需要空格分隔符)。

A.1列表终止符

  • ; :无论另一个命令的结果如何,都将在另一个命令完成后再运行一个命令。

    command1 ; command2
    

    首先command1运行,在前台运行,一旦完成,command2将运行。

    不在字符串文字中或某些关键字之后的换行符等于分号运算符。列表;分隔简单的命令仍然是一个清单-在shell的语法分析器仍旧必须继续遵循一个简单的命令来读取;执行前界定简单的命令,而新行可以界定一个完整的命令列表-列表或列表。区别是微妙的,但很复杂:鉴于外壳程序没有在换行符之后读取数据的强制性,换行符标志着外壳程序可以开始评估已经读取的简单命令的点,而;分号可以不是。

  • & :这将在后台运行命令,使您可以继续在同一Shell中工作。

     command1 & command2
    

    在这里,command1在后台command2启动,并立即在前台运行,而无需等待command1退出。

    之后的换行符command1是可选的。

A.2逻辑运算符

  • && :用于构建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
    

A.3管道操作员

  • |:管道运算符,它将一个命令的输出作为输入传递给另一命令。由管道运算符生成的命令称为管道

     command1 | command2
    

    所打印的任何输出command1都将作为输入传递command2

  • |&:这是2>&1 |bash和zsh的简写它会将一个命令的标准输出和标准错误传递给另一个命令。

    command1 |& command2
    

A.4其他清单标点

;;仅用于标记案例陈述的结尾Ksh,bash和zsh还支持;&解决下一种情况,并且;;&(在ATT ksh中不支持)继续进行后续的情况测试。

()用于对命令进行分组并在子shell中启动它们。{以及对}命令进行分组,但不要在子shell中启动它们。请参阅此答案以获取有关Shell语法中各种类型的括号,方括号和大括号的讨论。

B.重定向运算符

POSIX重定向运算符的定义

在shell命令语言中,是执行重定向功能的令牌。它是以下符号之一:

<     >     >|     <<     >>     <&     >&     <<-     <>

这些使您可以控制命令的输入和输出。它们可以出现在简单命令内的任何位置,也可以跟随命令。重定向按照从左到右的顺序显示。

  • < :为命令提供输入。

    command < file.txt
    

    以上将对command的内容执行file.txt

  • <>:与上面相同,但是文件以读写模式打开,而不是只读模式

    command <> file.txt
    

    如果文件不存在,将创建它。

    很少使用该运算符,因为命令通常仅从其stdin中读取,尽管在许多特定情况下它可以派上用场

  • > :将命令的输出定向到文件中。

    command > out.txt
    

    上面将保存输出commandout.txt如果文件存在,则其内容将被覆盖;如果文件不存在,则将创建它。

    此运算符还经常用于选择是将某些内容打印到标准错误还是标准输出中

    command >out.txt 2>error.txt
    

    在上面的示例中,>将重定向标准输出并2>重定向标准错误。您也可以使用重定向输出,1>但由于这是默认设置,因此1通常会省略并将其写为>

    因此,运行commandfile.txt并保存其输出out.txt和任何错误消息在error.txt你可以运行:

    command < file.txt > out.txt 2> error.txt
    
  • >|:与相同>,但即使外壳已配置为拒绝覆盖(使用set -Cset -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直到找到下一个出现将采取一切WORDText在上面的例子中,作为输入。尽管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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

重定向运算符,标准输入和命令参数

来自分类Dev

Shell中运算符$()的名称是什么?

来自分类Dev

Linux重定向:<<运算符

来自分类Dev

->运算符在grails中的含义和用法是什么?

来自分类Dev

是什么?和?? javascript中的运算符吗?

来自分类Dev

Laravel:{}运算符的含义和目的是什么?

来自分类Dev

在以下程序中&和&&运算符的用途是什么?

来自分类Dev

MySql中“ @”运算符的名称和用途是什么?

来自分类Dev

如何防止来自'&'和'>'运算符的输出(发送给后台运算符和重定向运算符)

来自分类Dev

如何防止来自'&'和'>'运算符的输出(发送给后台运算符和重定向运算符)

来自分类Dev

Linux命令:为什么重定向运算符-| 即管道在这里失败?

来自分类Dev

为什么在R的system()调用中将重定向运算符解释为文件?

来自分类Dev

Linux命令:为什么重定向运算符-| 即管道在这里失败?

来自分类Dev

cmd.exe重定向运算符的顺序和位置

来自分类Dev

“&^”运算符是什么意思?

来自分类Dev

%=运算符的作用是什么?

来自分类Dev

<>运算符是什么意思

来自分类Dev

PowerShell中的“>”运算符是什么?

来自分类Dev

“?:”运算符PHP的含义是什么

来自分类Dev

序言中的“->”运算符是什么?

来自分类Dev

Unix中的“ ./”运算符是什么?

来自分类Dev

&^运算符的作用是什么?

来自分类Dev

Golang中的“&^”运算符是什么?

来自分类Dev

运算符?=是什么意思?

来自分类Dev

这个运算符是什么?在Dart?

来自分类Dev

Elm的余数运算符是什么

来自分类Dev

序言中的“->”运算符是什么?

来自分类Dev

&运算符是什么意思?

来自分类Dev

HTML中的“:”运算符是什么?

Related 相关文章

热门标签

归档