Java教程

输入输出重定向

本文主要是介绍输入输出重定向,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

输入输出

目录
  • 输入输出
    • 重定向
      • 什么是重定向?
      • 重定向的应用场景
    • 命令返回值(扩展)
    • 输入输出- 文件描述符
    • 输入输出符号
      • 标准输出重定向覆盖
      • 标准输出重定向追加
      • 错误输出重定向
      • 正确和错误都输入到相同位置
      • 重定向到空设备/dev/null
    • 输入重定向
    • 思维导图

重定向

什么是重定向?

  • 将原本要输出到屏幕上的内容,重新输入到其他设备中

重定向的应用场景

  • 1.输出的内容,比较重要的时候,我们想把它保存到文件中
  • 2.在后台执行的程序,我不想让它输出的内容,干扰到屏幕
  • 3.将定时任务的结果保存下来(备份,是否成功)
  • 4.一些执行的命令,知道它有可能会有错误输出,但是不想看错误输出
  • 5.执行一个命令,可能报错和正确的输出并存,类似错误日志与标准正确日志需要分别输出至不同的文件

命令返回值(扩展)

#  如何判断一个命令是否执行成功
#  $? 命令的返回值
#  返回值是0,则代表上一条命令执行成功
#  返回值非0,则代表上一条命令执行不成功


## 示例:
[root@localhost~]# ll ./work -d
drwxr-xr-x. 2 root root 6 Mar 21 16:01 ./work
[root@localhost~]# echo $?
0

[root@localhost~]# ll ./work3 -d
ls: cannot access ./work3: No such file or directory
[root@localhost~]# echo $?
2

输入输出- 文件描述符

  • 文件描述符
    • 每个文件运行时都会占用文件描述符,就像文件运行是占用磁盘和内存是一样的
    • 打开一个文件或程序至少会占用4个文件描述符
名称 文件描述符 作用
stdin 0 标准输入
stdout 1 标准输出
stderr 2 错误输出
文件名 3+
# 查看当前系统中的文件描述符的命令:
ulimit -n

[root@localhost~]# ulimit -n
1024

# 查看系统进程
ps -ef

[root@localhost~]# ps  -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 15:54 ?        00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root          2      0  0 15:54 ?        00:00:00 [kthreadd]

### 查看并统计系统进程
[root@localhost~]# ps -ef | wc -l
99

### 查看fd文字描述符
[root@localhost~]# tail -f /var/log/messages
[root@localhost~]# ps -ef | grep tail
root       7327   7166  0 17:24 pts/0    00:00:00 tail -f /var/log/messages
root       7331   7309  0 17:25 pts/1    00:00:00 grep --color=auto tail

[root@localhost~]# ll /proc/
dr-xr-xr-x  9 root    root                  0 Apr 13 17:25 7327


[root@localhost~]# ll /proc/7327/fd
total 0
lrwx------ 1 root root 64 Apr 13 17:29 0 -> /dev/pts/0
lrwx------ 1 root root 64 Apr 13 17:29 1 -> /dev/pts/0
lrwx------ 1 root root 64 Apr 13 17:25 2 -> /dev/pts/0
lr-x------ 1 root root 64 Apr 13 17:29 3 -> /var/log/messages
lr-x------ 1 root root 64 Apr 13 17:29 4 -> anon_inode:inot

可以理解执行tail -f 这条命令占用了 5个文字描述符


### 通过设备了解stdin,stdout,stderr
[root@localhost~]# ll /dev/std*
lrwxrwxrwx 1 root root 15 Apr 13 15:54 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 Apr 13 15:54 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 Apr 13 15:54 /dev/stdout -> /proc/self/fd/1

# 通过上图中就是:

stdin   文件描字符是 0    输出到 /dev/pts/0
stdout  文件描字符是 1    输出到 /dev/pts/0
stderr  文件描字符是 2    输出到 /dev/pts/0

# 
[lx15@localhost~]# find / -type d -name '*test*' 1>/tmp/a.log 2>/tmp/b.log
[lx15@localhost~]# cat /tmp/b.log
find: ‘/boot/efi/EFI/centos’: Permission denied
find: ‘/boot/grub2’: Permission denied
find: ‘/proc/tty/driver’: Permission denied

[lx15@localhost~]# cat /tmp/a.log
/home/oldboy/test1
/home/qxtest
/home/qxtest2
/application/oldboy/test


输入输出符号

名称 符号 作用
标准输入重定向 < 或者 0< 将符号右边的内容交给符号左边的命令
<< 或者 0<<
标准输出覆盖重定向 > 或者 1> 将原本要输出在屏幕上的正确内容,覆盖到重定向的文件中
标准输出追加重定向 >> 或者1>> 将原本要输出在屏幕上的正确内容,追加到重定向的文件中
错误输出覆盖重定向 2> 将原本要输出在屏幕上的错误内容,覆盖到重定向的文件中
错误输出追加重定向 2>> 将原本要输出在屏幕上的错误内容,追加到重定向的文件中

标准输出重定向覆盖

## 标准输出重定向, 先清空,后写入, 如果文件不存在则创建
[root@localhost~]# echo 123 > 777.txt^C
[root@localhost~]# cat 777.txt 
sjkdhaj	sajlko
sas
sada
[root@localhost~]# echo 123 > 777.txt 
[root@localhost~]# cat 777.txt 
123

标准输出重定向追加

## 标准追加输出重定向, 向配置文件末尾追加内容
[root@localhost~]# cat 777.txt 
123
[root@localhost~]# echo 456 >> 777.txt 
[root@localhost~]# cat 777.txt 
123
456

错误输出重定向

## 正确输出然后错误输出重定向至一个文件
[lx15@localhost~]# find / -type d -name '*test*' 2> /tmp/c.log
/var/lib/yum/yumdb/y/93cd28c09a9dd46ac45b0ba169f6d75d9afe79d0-yum-plugin-fastestmirror-1.1.31-50.el7-noarch
/tmp/tsqxtest
/usr/lib/modules/3.10.0-957.el7.x86_64/kernel/drivers/ntb/test
/usr/lib64/python2.7/test
/usr/lib64/python2.7/unittest
/usr/lib64/python2.7/unittest/test
/usr/share/doc/python-pycurl-7.19.0/tests
/usr/share/doc/pygpgme-0.3/tests
/usr/share/doc/yum-plugin-fastestmirror-1.1.31
/home/zls/test1
/home/zls/test2
/home/oldboy/test1
/home/qxtest
/home/qxtest2
/application/oldboy/test

## 将标准输出和标准错误输出重定向到不同文件
[lx15@localhost~]# find / -type d -name '*test*' 1>/tmp/a.log 2>/tmp/b.log

正确和错误都输入到相同位置

## 将标准输出和错误输出重定向到同一个文件
### &:是将标准输出和错误输出以及都不属于两者的所有内容同时重定向一个文件
[lx15@localhost~]# find / -type d -name '*test*' &>/tmp/a.log

[lx15@localhost~]# find / -type d -name '*test*' 1>/tmp/a.log 2>/tmp/a.log
### 是将错误输出先重定向到标准输出  在将混合后的标准输出1重定向到一个文件中
2>&1 :就是将错误输出重定向到标准输出1(结果就是标准输出1里面混合了错误输出2的内容)
[lx15@localhost~]# find / -type d -name '*test*' 1>/tmp/a.log 2>&1

重定向到空设备/dev/null

## 保留标准输出的内容重定向到文件或者打印到屏幕上,错误输出的内容不保留
[lx15@localhost~]# find / -type d -name '*test*' 1>/tmp/a.log 2>/dev/null


[lx15@localhost~]#  find / -type d -name '*test*' 2>/dev/null
/var/lib/yum/yumdb/y/93cd28c09a9dd46ac45b0ba169f6d75d9afe79d0-yum-plugin-fastestmirror-1.1.31-50.el7-noarch
/tmp/tsqxtest
/usr/lib/modules/3.10.0-957.el7.x86_64/kernel/drivers/ntb/test
/usr/lib64/python2.7/test
/usr/lib64/python2.7/unittest
/usr/lib64/python2.7/unittest/test
/usr/share/doc/python-pycurl-7.19.0/tests
/usr/share/doc/pygpgme-0.3/tests
/usr/share/doc/yum-plugin-fastestmirror-1.1.31
/home/zls/test1
/home/zls/test2
/home/oldboy/test1
## 将多个不同的标准输出重定向到同一个文件中
## 需要将(多个程序用括号包起来然后用;隔开)
[lx15@localhost~]# (ls /work; cat 777.txt) > /tmp/d.log 
[lx15@localhost~]# cat /tmp/d.log
heiheihei.txt
kobe.jpg
kobe.txt
oldboy
oldgirl
passwd.txt
shen
123
456

输入重定向

  • 输入重定向,即原本从键盘等设备上获得的输入信息,重定向由命令的输出作为输入
[root@localhost~]# dd if=/dev/zero of=/opt/disk bs=1K count=1024
1024+0 records in
1024+0 records out
1048576 bytes (1.0 MB) copied, 0.0292382 s, 35.9 MB/s

dd if=/dev/zero of=/opt/disk bs=1K count=1024
dd </dev/zero >/opt/disk bs=1K count=1024

[root@localhost~]# dd </dev/zero >/opt/disk bs=1K count=1024
##
就是将/dev/zero的标准输入重定向到dd
再将dd的标准输出 重定向到/opt/disk


### 示例:
[root@localhost~]# cat << EOF
> 12456
> 789456
> EOF
12456
789456

# cat没有标准输出的重定向但是又重定向给cat的标准输入 所以会打印到屏幕上

思维导图

这篇关于输入输出重定向的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!