liujie
liujie
Published on 2024-01-10 / 41 Visits
0
0

Shell 中的 : > , >> , < , <<,<<< ,1>,2>,&>,|

Unix和Unix-like系统的Shell 中的 : > , >> , < , <<,<<< ,1>,2>,&>,|

在Unix和Unix-like系统的Shell中,常用的输出重定向操作包括:

  1. >1> - 标准输出重定向:

    • 用于将命令的标准输出(STDOUT)重定向到一个文件中,而不是显示在终端上。

    • 例如:ls > files.txt 会将ls命令的输出保存到files.txt文件中。

  2. 2> - 标准错误重定向:

    • 用于将命令的标准错误(STDERR)重定向到一个文件中。

    • 例如:ls non_existent_directory 2> error.txt 会将错误消息保存到error.txt文件中。

  3. &> - 标准输出和标准错误同时重定向:

    • 用于将命令的标准输出和标准错误都重定向到同一个文件中。

    • 例如:ls > all_output.txt 2>&1ls &> all_output.txt 会将所有输出都保存到all_output.txt文件中。

  4. >> - 追加到文件:

    • 用于将输出追加到现有文件的末尾,而不是覆盖它。

    • 例如:echo "new line" >> existing_file.txt 会将new line添加到existing_file.txt文件的末尾。

  5. < - 标准输入重定向:

    • 用于将文件的内容作为命令的输入。

    • 例如:sort < unsorted.txt 会将unsorted.txt文件的内容作为sort命令的输入。

  6. << - Here文档(Here Document):

    • 用于将接下来的输入直到一个定界符作为命令的标准输入。

    • 例如:

      cat <<EOF 
      line 1 
      line 2 
      EOF

      这将输出line 1line 2

  7. <<< - Here字符串(Here String):

    • 用于将一个字符串作为命令的标准输入。

    • 例如:grep "word" <<< "search for word" 会在给定的字符串中搜索"word"。

  8. | - 管道:

    • 用于将一个命令的输出作为另一个命令的输入。

    • 例如:ls | grep "txt" 会列出所有文件,然后只显示包含"txt"的行。

这些重定向和管道的使用非常灵活,可以根据需要组合使用来实现复杂的数据流控制。

为了避免权限问题,您可以尝试只在您的用户目录下或其他非系统目录中运行搜索命令。例如:

find ~ -name "*yunshu*"

这将只在您的用户目录(由~表示)和其子目录中搜索文件名包含"yunshu"的文件。

如果您想避免这些权限错误,可以将错误消息重定向到/dev/null,这样就只会看到成功的搜索结果:

find / -name "*yunshu*" 2>/dev/null

这里2>/dev/null是将标准错误(所有的错误消息)重定向到/dev/null,这是一个特殊的文件,会丢弃所有写入它的数据。这样您的输出中就只包含成功找到的文件路径了。

command 2>&1 > output.log

这样会先将标准错误重定向到标准输出,然后再将标准输出重定向到文件,实际上你会得到只有标准错误的输出,而标准输出会被丢弃。在命令中,2>&1 的顺序非常重要,必须在 1 被重定向之后执行,否则你可能会遇到将标准输出重定向到错误输出的问题

在 2>&1 中,数字和符号的含义如下:

1. 2

• 2 代表 标准错误输出(stderr),它是一个文件描述符。在 Linux 系统中,所有的输入和输出都与文件描述符相关联。标准错误输出(stderr)是一个专门用来输出错误信息的流,它的文件描述符是 2

标准输入(stdin):文件描述符为 0

标准输出(stdout):文件描述符为 1

标准错误输出(stderr):文件描述符为 2

2. &

• & 在这里表示 文件描述符。它用来指示后面紧跟着的 数字是文件描述符 而不是文件名。它告诉 shell,&1 指的是 文件描述符 1,也就是标准输出(stdout)。

也就是说,& 表示 将标准错误输出重定向到标准输出,它告诉系统 “去看文件描述符 1”。

3. 1

• 1 代表 标准输出(stdout),它是一个文件描述符,指向的是正常的输出流。通常,命令的正常结果输出都会显示在屏幕上,或者重定向到其他文件。

整体理解:2>&1

2 是标准错误输出的文件描述符(stderr)。

& 表示后面的是一个文件描述符,而不是文件名。

1 是标准输出的文件描述符(stdout)。

因此,2>&1 的意思是:将标准错误输出(stderr)重定向到标准输出(stdout)的位置,即将错误信息与正常输出合并到一起。


Comment