本文主要是介绍输入输出重定向,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
输入输出
目录
- 输入输出
- 重定向
- 命令返回值(扩展)
- 输入输出- 文件描述符
- 输入输出符号
- 标准输出重定向覆盖
- 标准输出重定向追加
- 错误输出重定向
- 正确和错误都输入到相同位置
- 重定向到空设备/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的标准输入 所以会打印到屏幕上
思维导图
这篇关于输入输出重定向的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!