Linux 中的命令行,提供了在系统上执行各种任务的强大能力。究其根源,是 Linux 在终端中内置了许多功能。
其中两个强大的功能是管道(pipe)和重定向(redirection)。这些功能使你能够将命令的输出和输入重定向到其他命令和文件,并从中获取输入。
在本文中,你将了解 Linux 中管道和重定向的含义,然后深入探讨,如何自己使用这些功能。
〇、 先决条件要完全理解本指南,你至少需要具备以下条件:
如果你是新手或需要复习,请参阅这个 Linux 命令行教程(https://www.freecodecamp.org/news/linux-command-line-tutorial/)。
一、 什么是 Linux 中的管道?在我们深入了解如何使用之前,管道是什么意思呢?管道是将一个 Linux 命令的输出作为另一个命令的输入的操作。你可以使用管道将一个命令的标准输出或标准错误重定向到另一个命令。
管道的一个简单示例是将一个命令的输出作为另一个命令的输入。管道(|)元字符用于实现此操作。
如果你对元字符的概念还不熟悉,那么也不用担心, 这只是命令行中具有特殊含义的字符的一个花哨的名字。除了管道(|)之外,Linux 中还有其他元字符。常见的例子包括小于号(<),大于号(>)和安培符号(&),等等。
管道基础知识使用 pipe 命令的基本语法如下:
command1 | command2 | command3 | ... | commandN
在上述语法中,终端将从左到右执行命令。它将从 command1 开始,然后将输出作为 command2 的输入。command2 的输出将作为 command3 的输入,依此类推。管道的好处在于你可以链接任意多个命令。
管道示例以下是使用 pipe 命令执行各种任务的几个示例。
1. 统计文件和目录的数量ls -l | wc -l
在上面的示例中,第一部分使用 ls 命令列出当前目录中的所有文件和目录。附加的 -l 选项告诉 ls 命令以长列表格式列出内容。
然后将 ls -l 命令的输出管道传输到第二部分。wc -l 命令统计第一部分中 ls -l 命令的输出的行数,并将结果打印到终端上。
2. 对文件和目录列表进行排序ls | sort
在上述命令中,ls 命令将输出当前目录中文件和目录的列表。然后将列表传输到 sort 命令,该命令按字母顺序对它们进行排序,并将结果打印到终端上。
3. 对文件中的单词进行排序并去重cat words.txt | sort -r | uniq
第三个示例包含三个单独的命令,由两个管道连接起来。第一个命令输出 words.txt 文件的内容,其中包含一个单词列表。
输出被传输到 sort -r 命令,该命令按照逆字母顺序对单词进行排序。最后,排序后的单词被传输到 uniq 命令,该命令删除重复项并输出唯一的排序后的单词。
为什么以及何时应用 Linux 命令管道?译注: 不知道你会不会好奇,输出单词列表后,直接用uniq命令去重,不行吗?为什么要先排序呢?
原因在于,uniq 命令只能去重相邻的行,也就是说,它只能去重连续出现的相同行。因此,如果文件中相同的单词不是连续出现的,uniq 命令就无法去重所有相同的单词。通过先对单词进行排序,可以确保相同的单词相邻出现,从而使 uniq 命令能够正确地去重。
管道,不仅仅是了解其语法。语法非常简单。要有效地使用管道,你应该理解其本质。
管道的目的是帮助你链接命令,将一个命令的输出作为另一个命令的输入。
管道并不意味着要将无关的命令链接在一起,以便按顺序执行。如果你需要这样做,请使用分号(;)将命令分隔开,见以下语法:
command1 ; command2 ; ... ; commandN
二、 什么是 Linux 中的重定向?
重定向:指示命令的输入或输出去向的操作。默认情况下,命令从标准输入接收数据,然后将结果输出到标准输出。
译注: 如果你觉得迷惑,请了解一下下面的几个概念。
概念 | 描述 |
标准输入(stdin) | 命令接收输入的地方,通常来自键盘或另一个命令的输出。 |
标准输出(stdout) | 命令的正常输出,通常显示在终端上。 |
标准错误(stderr) | 命令执行过程中产生的错误信息输出,通常显示在终端上。 |
标准输出重定向 | 允许将命令的输出重定向到文件或另一个命令,以便进一步处理或记录。 |
标准错误重定向 | 允许将命令的错误信息输出重定向到文件或另一个命令,以便更容易识别和处理错误。 |
重定向最常用的一个领域之一是在处理命令和文件时。例如,你可以将命令的输出重定向到文件中,而不是在终端中打印输出。或者,你可以将某个文件声明为命令的输入。
与管道类似,Linux 提供了特殊字符来执行重定向。以下是 Linux 中重要的文件重定向字符及其作用:
让我们具体了解每个文件重定向字符。
1. 使用>进行输出重定向> 符号使你能够将命令的输出重定向到某个特定文件。使用该符号,你可以将输出重定向到任何现有文件。如果文件不存在,则输出重定向字符将自动创建一个新文件。
但是,当向现有文件写入时,你应该小心,因为其内容将被覆盖而没有警告。
你可以使用以下语法执行输出重定向:
command > file
运行 command 后的输出将被写入 file,而不是标准输出(换句话说,不会打印到终端)。下面是一个输出重定向的示例:
ls -a > contents.txt
在上面的命令中,当前目录中的项目列表(包括点文件、目录和文件)将被写入 contents.txt 文件。由于重定向,你在终端上看不到任何输出。
2. 使用>>进行输出重定向>> 让你能够将命令的输出重定向到文件。但是,与使用单个大于符号 (>) 不同,如果你尝试写入现有文件,则 >> 将追加输出(而不是覆盖其内容)。如果文件不存在,则会创建一个新文件。
语法如下:
command >> file
以下是使用 >> 进行输出重定向执行与之前相同操作的示例:
ls -a >> contents.txt
3. 使用<进行输入重定向
命令行中的 < 字符使你能够将输入重定向到命令,而不是从键盘输入。使用 < 进行输入重定向的语法如下:
command < file
以下是使用输入重定向的示例:
wc -w < files.txt
在上面的示例中,我们将 files.txt 作为输入传递给 wc -w 命令,该命令计算文件中的单词数。但是,在许多情况下,你不需要使用输入重定向字符,因为这是默认行为。例如,上述命令类似于以下命令:
wc -w files.txt
4. 使用2>和2>>进行错误重定向
在命令行工作时,可能会遇到错误。例如,如果要执行一个没有适当权限的文件。你可以使用错误重定向字符来指示错误消息应该去哪里,而不是让终端通过打印错误来抛出错误。
将错误重定向到一个专门用于存储错误的文件是一个很好的选择。以下是一个简单的示例,尝试访问一个不存在的目录中的文件列表的命令:
ls nonexistent 2> error.txt
在上面的示例中,终端会抛出一个错误,因为没有名为 nonexistent 的文件。但是,它不会将错误消息打印到控制台,而是由于错误重定向字符的存在,它将被存储在 error.txt 文件中。然而,如果没有错误,则文件中将没有内容。
如果你必须将错误追加到现有文件而不是覆盖其内容,请使用 2>> 而不是 2>。
5. 使用&>和&>>进行输出和错误重定向与选择是将标准输出还是标准错误重定向到文件不同,&> 允许你同时重定向两者。你可以将 &> 视为组合输出重定向(>)和错误重定向(2>)字符的简写。
使用 &> 的语法如下:
command &> output.txt
command 的错误或输出将被写入 output.txt 文件。以下是一个示例:
ls sample &> output.txt
在上述命令中,如果 sample 目录不存在或存在但你没有读取权限,则适当的错误将被写入 output.txt 文件。但如果它存在且你有读取权限,则其内容将被输出到 output.txt 文件中。
使用 &>> 允许你将输出追加到文件中,如果文件存在且有内容。
如何结合管道和重定向释放命令行的威力结合使用管道和重定向可以让你在不费吹灰之力的情况下执行复杂的操作。通过学习如何结合这两者,你可以创建复杂的命令来执行各种操作,打字量更少。
以以下命令为例:
ls | grep ".txt" > text_files.txt
ls 命令列出当前目录的内容。输出被传输到 grep 命令以过滤文本文件。最后,grep 命令的输出被重定向到 text_files.txt 文件。
这个简单而强大的例子表明,当涉及到管道和重定向时,唯一的限制就是你的想象力。
结论译注: 笔者发挥想象力写了一个,可以统计一个项目中有多少Python代码,保存到文件中并cat出结果
echo "当前目录下共有 $(find . -name '*.py' -exec cat {} \ | wc -l) 行Python代码" > result.txt; cat result.txt
在本教程中,你学习了 Linux 中管道和重定向的基础知识。我们一起涵盖了基础知识以及如何使用这两者的示例。
这两个功能单独使用时是强大的,通过在命令中结合它们,你可以走得更远,就像最后一节所示。
译注: 本文译自 https://www.freecodecamp.org/news/linux-terminal-piping-and-redirection-guide/
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved