shell编程之重定向
Posted 永远不要矫情
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell编程之重定向相关的知识,希望对你有一定的参考价值。
1.重定向
重定向指的是将原来从标准输入设备(键盘)输入的数据,该由从其他文件或设备输入;或将原来应该输出到标准输出设备(显示器)的内容,输出到其他文件或设备。
2.文件标识符和标准输入输出
系统在启动一个进程的同时会为该进程打开三个文件:标准输入(stdin),标准输出(stdout)和标准错误输出(stderr),分别用文件标识符0,1,2来标识。如果要为进程打开其他的输入输出,则需要从整数3开始标识。默认情况下,标准输入为键盘,标准输出和错误输出为显示器。
3.I/O重定向
I/O重定向是重定向中比较重要的部分,将任何文件、命令、脚本、程序或脚本的输出重定向到另外一个文件、命令或脚本。常见的I/O重定向符号如下所示:
符号 | 含义 |
---|---|
> | 标准输出覆盖重定向:将命令的输出重定向输出到其他文件中 |
>> | 标准输出追加重定向:将命令的输出重定向输出到其他文件中 |
>& | 标识输出重定向:将一个标识的输出重定向到另一个标识的输入 |
< | 标准输入重定向:命令将从指定文件中读取输入而不是从键盘输入 |
| | 管道符,从一个命令中读取输出并作为另一个命令的输入 |
3.1 标准输出覆盖重定向:>
3.1.1 标准输出覆盖重定向:>的基本用法
使用标准输出覆盖重定向将原来输出到显示器上的内容重定向输出到一个文件中,例如:
[root@node1 test]# ls -l
total 4
-rwxrwxrwx 1 root root 48 Apr 24 21:03 my_prog.sh
[root@node1 test]# ls -l >ls_test.txt
[root@node1 test]# cat ls_test.txt
total 4
-rw-r--r-- 1 root root 0 May 10 15:54 ls_test.txt
-rwxrwxrwx 1 root root 48 Apr 24 21:03 my_prog.sh
需要注意的是如果指定的重定向文件不存在,则会创建这个文件,如果文件存在且内容不为空,则源文件内容将会被清空。 例如:
[root@node1 test]# mkdir a
[root@node1 test]# ll
total 12
drwxr-xr-x 2 root root 4096 May 10 15:58 a
-rw-r--r-- 1 root root 109 May 10 15:54 ls_test.txt
-rwxrwxrwx 1 root root 48 Apr 24 21:03 my_prog.sh
[root@node1 test]# cat ls_test.txt
total 7
[root@node1 test]# ls -l > ls_test.txt
[root@node1 test]# cat ls_test.txt
total 8
drwxr-xr-x 2 root root 4096 May 10 15:58 a
-rw-r--r-- 1 root root 0 May 10 15:59 ls_test.txt
-rwxrwxrwx 1 root root 48 Apr 24 21:03 my_prog.sh
3.1.2标准输出覆盖重定向指定文件标识符
当发现指定的路径不存在时,重定向会报错:
[root@node1 test]# ls /home/uji > ls_test.txt
ls: cannot access /home/uji: No such file or directory
因为在标准输出覆盖重定向其实是将文件标识符为1的内容重定向到指定文件中,所有以下写的方法是等价的:
[root@node1 test]# ls /home/uji > ls_test.txt
ls: cannot access /home/uji: No such file or directory
[root@node1 test]# ls /home/uji 1> ls_test.txt
ls: cannot access /home/uji: No such file or directory
我们将1改为2,则将错误信息重定向到指定文件,例如:
[root@node1 test]# ls /home/uji 2> ls_test.txt
[root@node1 test]# cat ls_test.txt
ls: cannot access /home/uji: No such file or directory
如果命令既有标准输出,又有标准错误输出,使用命令如下:
[root@node1 test]# COMMAND 1>stdout.txt 2>stderr.txt
3.2 标准输出追加重定向:>>
如果指定的重定向文件存在且内容不为空,重定向并不会清空原文件内容,而是将命令的输出追加到文件的尾部,例如:
[root@node1 test]# cat ls_test.txt
ls: cannot access /home/uji: No such file or directory
[root@node1 test]# ls -l >> ls_test.txt
[root@node1 test]# cat ls_test.txt
ls: cannot access /home/uji: No such file or directory
total 12
drwxr-xr-x 2 root root 4096 May 10 15:58 a
-rw-r--r-- 1 root root 55 May 10 16:06 ls_test.txt
-rwxrwxrwx 1 root root 48 Apr 24 21:03 my_prog.sh
3.3 标识输出重定向:>&
标识输出重定向的作用是将一个标识的输出重定向到另一个标识的输入。例如:
[root@node1 test]# COMMAND > stdout_stderror.txt 2>&1
执行command命令,将标准输出的内容重定向到stdout_stderror.txt,如果有标准错误输出也同时重定向到该文件。例如:
[test@node1 ~]$ find / -type f -name *.txt
find: ‘/lost+found’: Permission denied
find: ‘/etc/dhcp’: Permission denied
find: ‘/etc/grub.d’: Permission denied
find: ‘/etc/firewalld’: Permission denied
find: ‘/etc/sudoers.d’: Permission denied
find: ‘/etc/ntp/crypto’: Permission denied
find: ‘/etc/audisp’: Permission denied
find: ‘/etc/selinux/final’: Permission denied
find: ‘/etc/selinux/targeted/active’: Permission denied
find: ‘/etc/audit’: Permission denied
find: ‘/etc/pki/rsyslog’: Permission denied
/etc/pki/nssdb/pkcs11.txt
find: ‘/etc/pki/CA/private’: Permission denied
find: ‘/etc/polkit-1/rules.d’: Permission denied
find: ‘/etc/polkit-1/localauthority’: Permission denied
find: ‘/run/pure-ftpd’: Permission denied
find: ‘/run/firewalld’: Permission denied
find: ‘/run/user/0’: Permission denied
find: ‘/run/sudo’: Permission denied
find: ‘/run/cryptsetup’: Permission denied
find: ‘/run/log/journal/4284cfe27c5b48c38adde30f33b4bb60’: Permission denied
find: ‘/run/systemd/inaccessible’: Permission denied
.....
[test@node1 ~]$ find / -type f -name *.txt > find_test.txt 2>&1
若没有必要保存错误输出时,将所有错误输出重定向到该设备中,语法如下:
COMMAND > stdout.txt 2> /dev/null
3.4 标准输入重定向:<
标准输入重定向是将原本从标准输入设备中读取的内容转由文件内容输入。例如,在命令行中输入cat命令,系统等待键盘输入,当输入a并回车时,cat命令会读取并立即输出a,再使用Ctrl+D终止输入。把文件cat.txt标准输入重定向给cat命令后,cat输出文件内容
[test@node1 ~]$ cat
a
a
[test@node1 ~]$ cat cat.txt
shj
[test@node1 ~]$ cat < cat.txt
shj
3.5 管道符
管道符将一个命令的输出作为另一个命令的输入
以上是关于shell编程之重定向的主要内容,如果未能解决你的问题,请参考以下文章