本文共 4041 字,大约阅读时间需要 13 分钟。
执行完linux命令之后,希望将标准输出和错误输出分别重定向到不同的文件,否则在同一个文件的话,后期代码中不好处理,所以需要了解下知识背景。
系统中实际上有12个文件描述符,但是正如我们在上表中所看到的, 0、1、2是标准输入、输出和错误。可以任意使用文件描述符3到9。
标准输入是文件描述符0。它是命令的输入,缺省是键盘,也可以是文件或其他命令的输出。
标准输出是文件描述符1。它是命令的输出,缺省是屏幕,也可以是文件。 标准错误是文件描述符2。这是命令错误的输出,缺省是屏幕,同样也可以是文件。主要用于改变命令的输入源,让输入不要来自键盘,而来自指定文件。基本用法:
命令 < 文件名
$ ls < ls.out 1
主要用于改变命令的输出,让标准输出不要显示在屏幕上,而是写入到指定文件中。基本用法:
命令 > 文件名$ ls > ls.out 1
以上是对标准输出来讲的,至于标准错误输出的重定向,只需要换一种符号,将 > 改为 2> ,将 >> 改为 2>>。将标准输出和标准错误输出重定向到同一文件,则使用符号 &>。
为了重定向标准错误,可以指定文件描述符2。
grep命令没有找到该文件,缺省地向终端输出了一个错误信息。现在让我们把错误重定向到文件/dev/null中(实际就上是系统的垃圾箱): $ grep “trident” missiles 2>/dev/null 这样所有的错误输出都输送到了/dev/null,不再出现在屏幕上。合并标准输出和标准错误
在合并标准输出和标准错误的时候,切记shell是从左至右分析相应的命令的。下面给出一个例子:
$ cleanup >cleanup.out 2>&1 在上面的例子中,我们将cleanup 脚本的输出重定向到>cleanup.out文件中,而且其错误也被重定向到相同的文件中。 $ grep “standard”* > grep.out 2>&1 在上面的例子中,grep命令的标准输出和标准错误都被重定向到grep.out文件中。你在使出前面提到的“此处”文挡时,有可能需要把所有的输出都保存到一个文件中,这样万一出现了错误,就能够被记录下来。通过使用2 > & 1就可以做到这一点& 表示等同于的意思,2>&1,表示2的输出重定向等同于1,即和1重定向的文件系统上的位置是一样的
重定向的使用有如下规律:
1)标准输入0、输出1、错误2需要分别重定向,一个重定向只能改变它们中的一个。 2)标准输入0和标准输出1可以省略。(当其出现重定向符号左侧时) 3)文件描述符在重定向符号左侧时直接写即可,在右侧时前面加& 【类似于指针前要加*号,来区分这、两种情况】。 4)文件描述符与重定向符号之间不能有空格!转自:
$ df -h >file(base) pc@pc-System-Product-Name:/project/raw_fq$ cat file1Filesystem Size Used Avail Use% Mounted onudev 32G 0 32G 0% /devtmpfs 6.3G 2.4M 6.3G 1% /run/dev/nvme0n1p2 228G 11G 207G 5% /tmpfs 32G 0 32G 0% /dev/shmtmpfs 5.0M 4.0K 5.0M 1% /run/locktmpfs 32G 0 32G 0% /sys/fs/cgroup/dev/loop0 13M 13M 0 100% /snap/gnome-characters/139/dev/loop2 2.3M 2.3M 0 100% /snap/gnome-calculator/260/dev/loop1 36M 36M 0 100% /snap/gtk-common-themes/1198/dev/loop4 152M 152M 0 100% /snap/gnome-3-28-1804/36/dev/loop3 141M 141M 0 100% /snap/gnome-3-26-1604/82/dev/loop5 141M 141M 0 100% /snap/gnome-3-26-1604/74/dev/loop6 3.8M 3.8M 0 100% /snap/gnome-system-monitor/57/dev/loop7 4.2M 4.2M 0 100% /snap/gnome-calculator/406/dev/loop8 1.0M 1.0M 0 100% /snap/gnome-logs/61/dev/loop9 90M 90M 0 100% /snap/core/6673/dev/loop10 15M 15M 0 100% /snap/gnome-logs/45/dev/nvme0n1p1 511M 6.1M 505M 2% /boot/efi/dev/loop11 35M 35M 0 100% /snap/gtk-common-themes/818/dev/loop12 91M 91M 0 100% /snap/core/6350/dev/loop13 15M 15M 0 100% /snap/gnome-characters/254/dev/loop14 54M 54M 0 100% /snap/core18/941/dev/loop15 3.8M 3.8M 0 100% /snap/gnome-system-monitor/77/dev/sda1 7.3T 5.3T 1.6T 78% /data/dev/sdb1 7.3T 93M 6.9T 1% /public/dev/sdd1 7.3T 572M 6.9T 1% /home/dev/sdc1 7.3T 173G 6.7T 3% /projecttmpfs 6.3G 16K 6.3G 1% /run/user/121tmpfs 6.3G 36K 6.3G 1% /run/user/1000/dev/loop16 90M 90M 0 100% /snap/core/6818/dev/loop17 15M 15M 0 100% /snap/gnome-characters/258/dev/loop18 3.8M 3.8M 0 100% /snap/gnome-system-monitor/81/dev/loop19 152M 152M 0 100% /snap/gnome-3-28-1804/40$ df -h > file1$ diff file1 file28c28/dev/sdc1 7.3T 173G 6.7T 3% /project/dev/sdc1 7.3T 163G 6.7T 3% /project 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
$ ls /error test >right_file 2>wrong_file$ cat right_filetest:hangshu.texresult.txttext.txt$ cat wrong_filels: cannot access '/error': No such file or directory 1 2 3 4 5 6 7 8
$ ls /error test >all.log 2>&1$ cat all.logls: cannot access '/error': No such file or directorytest:hangshu.texresult.txttext.txt 1 2 3 4 5 6 7
ls /error test &>all2.log$ cat all2.logls: cannot access '/error': No such file or directorytest:hangshu.texresult.txttext.txt 1 2 3 4 5 6 7
参考的文档:
转载地址:http://kykai.baihongyu.com/