首先区分一下标准输出和标准错误输出。
简单的说,标准输出指的是命令执行所传回的正确的信息,而标准错误输出可理解为命令执行失败后所传回的错误信息。
数据重定向就是把标准输出和标准错误输出的结果分别传送到其他的文件或者设备中去,这对于我们想要将某些数据保存下来是很有用的。分别传送所用的字符如下:
1、标准输入(stdin):代码为0,使用< 或 <<;
2、标准输出(stdout):代码为1,使用> 或 >>;
3、标准错误输出(stderr):代码为2,使用2> 或 2>>;
这里说明一下:单个(> 或 <)是指覆盖写,覆盖的意思就是如果目标文件存在数据时,把原数据清空,再写进去。而双个(<< 或 >>)是指追加写。也就是,接在原数据的后面写入。
当你以一般身份来执行find命令的时候,由于权限的问题会产生一些错误信息。
jie@instance-v7jtqjmo:~$ find /home -name .bashrc
/home/jie/.bashrc
find: ‘/home/jie/tomcat/tomcat8.5/conf/Catalina’: Permission denied //错误信息
find: ‘/home/jie/tomcat/tomcat8.5/work/Catalina’: Permission denied //错误信息
/home/gitlab-runner/.bashrc
这是由于/home下面我还创建了其他的账号,而我以一般的身份来运行命令,无法进入其他账号的主文件夹,所以就会出现权限错误的问题。
下面我来将正确信息重定向到list文件中。
jie@instance-v7jtqjmo:~$ find /home -name .bashrc > list
find: ‘/home/jie/tomcat/tomcat8.5/conf/Catalina’: Permission denied
find: ‘/home/jie/tomcat/tomcat8.5/work/Catalina’: Permission denied
可以看到正确信息已经不见了,只剩下了错误信息。然后查看list文件:
jie@instance-v7jtqjmo:~$ cat list
/home/jie/.bashrc
/home/gitlab-runner/.bashrc
会发现刚刚的正确信息以及被写进来了。
这时屏幕上还是有错误信息,我们可以将错误信息和正确信息分别存到不同的文件中,比如:
jie@instance-v7jtqjmo:~$ find /home -name .bashrc > list 2> list_error
会发现屏幕上已经没有任何信息了,任何打开两个文件查看:正确信息和错误信息都被写到了不同的文件中。
jie@instance-v7jtqjmo:~$ cat list
/home/jie/.bashrc
/home/gitlab-runner/.bashrc
jie@instance-v7jtqjmo:~$ cat list_error
find: ‘/home/jie/tomcat/tomcat8.5/conf/Catalina’: Permission denied
find: ‘/home/jie/tomcat/tomcat8.5/work/Catalina’: Permission denied
下面来试试>> ,, 会发现信息是在list后面追加的。而没有覆盖掉。
jie@instance-v7jtqjmo:~$ find /home -name .bashrc >> list
find: ‘/home/jie/tomcat/tomcat8.5/conf/Catalina’: Permission denied
find: ‘/home/jie/tomcat/tomcat8.5/work/Catalina’: Permission denied
jie@instance-v7jtqjmo:~$ cat list
/home/jie/.bashrc
/home/gitlab-runner/.bashrc
/home/jie/.bashrc
/home/gitlab-runner/.bashrc
如果想不存储错误信息,可以直接丢进垃圾桶/dev/null
jie@instance-v7jtqjmo:~$ find /home -name .bashrc 2> /dev/null
/home/jie/.bashrc
/home/gitlab-runner/.bashrc
如果想把正确信息和错误信息存到一个文件中,可以用&> list(文件名)
jie@instance-v7jtqjmo:~$ find /home -name .bashrc &> list
然后查看一下list文件:正确和错误信息都被写进去了
jie@instance-v7jtqjmo:~$ cat list
/home/jie/.bashrc
find: ‘/home/jie/tomcat/tomcat8.5/conf/Catalina’: Permission denied
find: ‘/home/jie/tomcat/tomcat8.5/work/Catalina’: Permission denied
/home/gitlab-runner/.bashrc
标准输入就是将原本需要由键盘输入的数据改由文件内容来替代。
那什么事键盘输入呢?下面通过cat命令来了解一下。
cat > catfile
test
test cat create file
<==这里按下【Ctrl + D】来结束输入。
cat查看刚刚创建的文件,大概是下面这个样子啦
jie@instance-v7jtqjmo:~$ cat catfile
test
test cat create file
用stdin来代替键盘输入以创建新文件。
jie@instance-v7jtqjmo:~$ cat > catfile < Dockerfile //通过<标准输入创建文件
jie@instance-v7jtqjmo:~$ ll catfile Dockerfile //这里可以看到这两个文件几乎一模一样
-rw-rw-r-- 1 jie jie 198 Apr 2 20:58 catfile
-rw-r--r-- 1 jie jie 198 Mar 29 20:04 Dockerfile
而<< 在这里是代表结束输出的意思。
jie@instance-v7jtqjmo:~$ cat > catfile << "q" //用它来指定结束符
> ds
> dsd
> ds
> q
说了这么多,那么输出重定向有啥用呢。