流、管道和重定向


Linux shell(比如 Bash)接收或发送序列和字符串流形式的输入或输出。每个字符都独立于与之相邻的字符。字符没有被组织成结构化记录或固定大小的块。不管实际的字符串流进入或来自文件、键盘、显示窗口或其他 I/O 设备,都使用文件 I/O 技术来访问流。

Linux shell 使用 3 种标准的 I/O 流,每种流都与一个文件描述符相关联: 
1. stdout 是标准输出流,它显示来自命令的输出。它的文件描述符为 1。 
2. stderr 是标准错误流,它显示来自命令的错误输出。它的文件描述符为 2。 
3. stdin 是标准输入流,它为命令提供输入。它的文件描述符为 0。

输入流通常通过终端击键为程序提供输入。输出流通常向终端输出文本字符。最初的终端是 ASCII 打字机或显示终端,但现在更多是指图形桌面上的文本窗口。

重定向
重定向输出
可以通过两种方法将输出重定向到文件。 
n> 
将输出从文件描述符 n 重定向到文件。您必须具有该文件的写权限。如果该文件不存在,将创建它。如果该文件已经存在,通常将覆盖所有现有内容,并且没有任何警告。 
n>> 
还可以将输出从文件描述符 n 重定向到一个文件中。这里也一样要求您具有该文件的写权限。如果该文件不存在,将创建它。如果该文件已经存在,输出将附加到现有的内容后面。

在 n> 或 n>> 中的 n 引用文件描述符。如果省略它,将执行标准输出。

&> 或 &>> 同时将标准输出和标准错误重定向到同一个文件中。 
另一种方法是,首先重定向文件描述符 n,然后使用 m>&n 或 m>>&n 将文件描述符 m 重定向到同一个文件。

command 2>&1 >output.txt 
不同于 
command >output.txt 2>&1 
在第一种情况中,stderr 被重定向到 stdout 的当前位置,然后在将 stdout 重定向到 output.txt,但第二次重定向仅影响 stdout,不影响 stderr。在第二种情况中,stderr 被重定向到 stdout 的当前位置,即 output.txt。

重定向输入

输入重定向到一个程序 
|& 
将一个标准错误 管道 输送 到另一个命令作为输入 
<< 多行标准输入重定向符号 
Shell(包括 bash)还有存在 here-document 的概念,它是另一种输入重定向形式。它将 << 和一个单词(比如 END)结合构成一个标记,用来表示输入端。如下。

$ sort -k2 <<END
> 1 apple
> 2 pear
> 3 banana
> END
1 apple
3 banana
2 pear

表示将两个EOF之间的内容作为标准输入的内容。

当然,我们也可以结合标准输出重定向将输出的内容再次重定向到别的文件中

cat << EOF > f1
aaaaaa
bbbbbb
EOF
也可以这样写
cat > f1 << EOF
aaaaaa
bbbbbb
EOF

管道
如果某个敲击某个命令以后,会进入自己的命令行模式,如fdisk这种命令,但是我们需要脚本去完成我们的命令 
那么还有一种实现方式,这种写法用到了管道。 
echo ‘命令1 
命令2 
行首回车表示直接回车 
命令4’ | fdisk /dev/sdd9

通过管道将 stdout 导入到 stdin
在两个命令之间使用管道 | 操作符将的一个命令的 stdout 指向第二个命令的 stdin。您可以通过添加更多的命令和管道操作符来构造更长的管道线。任何命令都可能包含选项或参数。许多命令使用连字符 (-) 取代文件名作为一个参数,用于表示输入来自 stdin 而不是文件。

需要说明的是,管道线仅将 stdout 导向 stdin。您不能使用 2| 单独导出 stderr,至少使用我们目前所了解的工具还不能这样做。如果 stderr 已被重定向到 stdout,那么两个流都会被通过管道导出。

区别
重定向把一个方向的输入和输出换成其他的形式。 
管道把两个方向的输入和输出做一个转化。
 

猜你喜欢

转载自blog.csdn.net/everyst/article/details/85092949