在Linux终端下运行命令时有很多方法可以重定向信息。在终端中有一些重定向约定,可以让信息的重定向变得非常简单。
重定向约定有以下几项:
- Output
- Append
- Input
- Error
- Unnamed Pipe
- Tee
- Named Pipe
1、Output
输出管道用来将标准输出输出到屏幕以外的其他地方,通常是输出到屏幕上,当然我们也可以把信息输出到文件中。
输出管道是”>“符号。
例如,如果我们想为主文件夹创建一个文件列表,并将列表放入一个名为“HOME_folder.txt”的文件中,命令如下:
touch Home_Folder.txt
chmod 777 Home_Folder.txt
ls > Home_Folder.txt
ps:chmod为更改文件权限命令,在《文件权限》这篇博客中有详细讲解。
这时打开HOME_folder.txt文件即可看到ls的信息全部打印到该文件中了。或者我们可以运行cat命令将文件内容打印到屏幕上:
cat Home_Folder.txt
如果我们只想在主文件下创建一个名为“empty.txt”的空文,则可以运行以下命令:
> empty.txt
因为没有输入,所以它的内容为空。如果该文件已经存在,则它将被删除并重新生成一个空文件。
输出管道不仅能创建一个文件,它还可以删除并创建一个文件。如果你对文件HOME_folder.txt执行了另一个输出,则这个文件原来的内容将被删除,并使用新的输出重新创建文件。
命令生成的任何文本输出都可以保存到文件中。
2、Append
如果不想删除文件中的现有信息,只想向文件中追加信息,则可以使用“>>”符号。
我们可以使用以下命令向文件HOME_folder.txt中再添加一个ls信息:
ls >> Home_Folder.txt
这样的话两个信息文本之间没有空行,如果想要添加空行,我们可以执行以下命令:
echo ' ' >> Home_Folder.txt
3、Input
和输出管道相反,输入管道是将文件的内容作为输入,并且符号为"<"。
如果我们使用文件HOME_folder.txt并统计该文件的行数,我们可以使用以下命令:
wc -l < Listing.txt
当然,在这里也可以不需要重定向"<",可以直接运行"wc -l"命令。不过他确实显示了这个命令是如何工作的。
下面我们再举一个例子,用输入和输出定向器复制一个文件。如我们复制Listing.txt到Listing1.txt,命令如下:
cat < Listing.txt > Listing1.txt
文件Listing.txt的内容被读入,而不是显示到屏幕上,标准输出到文件Listing1.txt中。
由此可见,多个管道可以同时使用,并且可以非常简单的实现很多功能。
3、Error
终端中的命令有时可能导致错误。假设有一个图形用户界面(GUI)可执行程序不能正常工作,我们可能没有在屏幕上看到错误,但这并不意味着它们没有发生。假设程序是主文件夹并调用App1。打开终端并确保当前位置在主文件夹中。输入以下命令:
./App1 2> App1-error.txt
数字“2”表示标准错误(stderr)输出。“2”将使错误输出与标准输出区别开,并且只捕获错误输出。
现在可以打开App1-error.txt文件,并复制错误消息,在互联网上搜索可能的解决方案。
4、Unnamed Pipe
未命名的管道由竖条(|)表示。基本上,这个管道的作用是获取第一个命令的输出,并在第二个命令中使用它。例如,我们想要计算桌面图标的数量。我可以执行以下命令:
ls ~/Desktop | wc -l
桌面文件夹中的文件列表通过Word Count (wc)程序发送(“-l”表示计算行数)。桌面上的每一项都是“ls”命令的单行输出。该命令有一个问题在于,它不显示“垃圾站”或挂载驱动器的图标,因为这些图标来自其他地方,没有保存在桌面文件夹中。
5、Tee
有时,我们希望将信息放在文件中或在其他地方使用,但仍然要显示在屏幕上。
使用上面列出主文件夹中的文件的例子,我们还可以用命令将输出显示到屏幕上:
ls ~ | tee ~/Home-Folder.txt
我们可以通过“tee”输出到多个文件。例如,我们可以用以下命令将相同的命令输出到文件File1、File2和File3:
ls ~ | tee File1 File2 File3
可以根据需要列出更多的文件。
6、Named Pipe
命名管道与我们之前看到的不同。命名管道通常称为进程间通信(IPC),命名管道允许我们创建具有特定名称的管道。
首先,让我们创建一个管道。命名管道可以是任何有效的名称。我们将管道命名为“Linux”。的命令是:
mkfifo Linux
创建管道的文件夹将出现在其中。您可以稍后删除它,或者留着以供使用。现在管道已经创建成功,我们来使用它。在终端下输入以下命令:
ls > Linux
光标应该移动到下一行,停止时不提示输入新命令。不要关闭终端,而是打开一个新的终端机。一旦新终端打开,输入以下命令:
cat < Linux
我们可以看到在第二个终端中显示的第一个终端创建的文件列表。现在第一个终端中的提示符应该显示了。可以创建多个命名管道并跨多个终端,从命名管道获取数据后,它是空的,但仍然存在。
要删除命名管道,可以运行以下命令;
rm Linux
经过这篇博客,我们应该对Linux的重定向和管道有了一定的了解,在以后会经常用到它们。