管道默认是连接前一个命令的输出到下一个命令的输入
Linux中提供三个标准输入与输出:
文件路径 | 文件作用 |
---|---|
/dev/stdin | 用于标准输入 |
/dev/stdout | 用于标准输出 |
/dev/stderr | 用于错误输出 |
简单的重定向
# 通过管道把文件的输出作为cat的输出,并把cat的输出作为文件test的输入当输入追加为EOF结束
echo 'hello' | cat > test <<EOF
将echo命令通过管道传过来的数据作为cat命令的输入,将标准输出作为命令的输出
echo 'xx' | cat
# 输出结果为xx
标准错误重定向
# 将标准错误重定向到标准输出,再将标准输出重定向到文件,注意要将重定向到文件写到前面
$ cat Documents/test.c hello.c >somefile 2>&1
# 或者只用bash提供的特殊的重定向符号"&"将标准错误和标准输出同时重定向到文件
$ cat Documents/test.c hello.c &>somefilehell
tee命令,用于重定向到多个文件
你可能还有这样的需求,除了需要将输出重定向到文件,也需要将信息打印在终端。那么你可以使用tee命令来实现:
# 通过管道和tee命令重定向文件
echo 'hello world' | tee hello
# 终端输出并把内容重定向输入到文件hello中
永久重定向
zsh用于在当前终端开启子终端,输入exit结束
前面的重定向操作都只是临时性的,即只对当前命令有效,那如何做到“永久”有效呢,比如在一个脚本中,你需要某一部分的命令的输出全部进行重定向,难道要让你在每个命令上面加上临时重定向的操作嘛,当然不需要,我们可以使用exec命令实现“永久”重定向。exec命令的作用是使用指定的命令替换当前的 Shell,即使用一个进程替换当前进程,或者指定新的重定向:
# 先开启一个子 Shell
$ zsh
# 使用exec替换当前进程的重定向,将标准输出重定向到一个文件
$ exec 1>somefile
# 后面你执行的命令的输出都将被重定向到文件中,直到你退出当前子shell,或取消exec的重定向
$ ls
$ exit
$ cat somefile
完全屏蔽命令的输出
在 Linux 中有一个被称为“黑洞”的设备文件,所有导入它的数据都将被“吞噬”。
在类 UNIX 系统中,/dev/null,或称空设备,是一个特殊的设备文件,它通常被用于丢弃不需要的输出流,或作为用于输入流的空文件,这些操作通常由重定向完成。读取它则会立即得到一个EOF。
我们可以利用设个/dev/null屏蔽命令的输出:
cat ss 1>/dev/null