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 管道符
管道符将一个命令的输出作为另一个命令的输入

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永远不要矫情

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值