Linux数据流重定向

部分转自实验楼。

  • > 会清空文件,然后将输出写入该文件。
  • >> 会把输出添加到文件的末尾。
  • 同时,<和<<操作也是没有问题的,它们的区别在于重定向的方向不一致而已,>表示是从左到右,<右到左。

简单的重定向

文件描述符  设备文件      说明
0          /dev/stdin   标准输入
1          /dev/stdout  标准输出
2          /dev/stderr  标准错误

默认使用终端的标准输入作为命令的输入和标准输出作为命令的输出:

$ cat 
(按Ctrl+C退出)

将cat的连续输出(heredoc方式,实时输入到文件)重定向到一个文件

$ mkdir Documents
$ cat > Documents/test.c <

int main()
{
    printf("hello world\n");
    return 0;
}

EOF

将一个文件作为命令的输入,标准输出作为命令的输出

$ cat Documents/test.c

将echo命令通过管道传过来的数据作为cat命令的输入,将标准输出作为命令的输出

$ echo 'hi' | cat

将echo命令的输出从默认的标准输出重定向到一个普通文件

$ echo 'hello shiyanlou' > redirect
$ cat redirect

管道默认是连接前一个命令的输出到下一个命令的输入,而重定向通常是需要一个文件来建立两个命令的连接

标准错误重定向

# 使用cat 命令同时读取两个文件,其中一个存在,另一个不存在
$ cat Documents/test.c hello.c
# 你可以看到除了正确输出了前一个文件的内容,还在末尾出现了一条错误信息
# 下面我们将输出重定向到一个文件
$ cat Documents/test.c hello.c > somefile
Linux数据流重定向_第1张图片
image.png

遗憾的是,这里依然出现了那条错误信息,这正是因为如我上面说的那样,标准输出和标准错误虽然都指向终端屏幕,实际它们并不一样。那有的时候我们就是要隐藏某些错误或者警告,那又该怎么做呢。这就需要用到我们前面讲的文件描述符了:

# 将标准错误重定向到标准输出,再将标准输出重定向到文件,注意要将重定向到文件写到前面
$ cat Documents/test.c hello.c >somefile  2>&1
# 或者只用bash提供的特殊的重定向符号"&"将标准错误和标准输出同时重定向到文件
$ cat Documents/test.c hello.c &>somefilehell

注意你应该在输出重定向文件描述符前加上&,否则shell会当做重定向到一个文件名为1的文件中。

&1的含义就可以理解为用标准输出的引用。为什么2>&1 要放在后边呢? 是因为2(也就是错误输出)要重定向到&1,也就是标准输出的引用中,也就是标准输出打开的文件中,所以需要现在前面打开1的输出文件。

使用tee命令同时重定向到多个文件

你可能还有这样的需求,除了需要将输出重定向到文件,也需要将信息打印在终端。那么你可以使用tee命令来实现:

$ echo 'hello shiyanlou' | tee hello
Linux数据流重定向_第2张图片
image.png

永久重定向

我们可以使用exec命令实现“永久”重定向。exec命令的作用是使用指定的命令替换当前的 Shell,即使用一个进程替换当前进程,或者指定新的重定向:

# 使用exec替换当前进程的重定向,将标准输出重定向到一个文件
$ exec 1>somefile
# 后面你执行的命令的输出都将被重定向到文件中,直到你退出当前shell,或取消exec的重定向(后面将告诉你怎么做)
$ ls
$ exit
$ cat somefile

你可能感兴趣的:(Linux数据流重定向)