关于Linux I/O 重定向
Linux 的标准输入,标准输出,标准错误
1.标准输入就是键盘或者鼠标输入到linux的信息,英文standard input 简写stdin,linux用文件符号0表示标准输入 如下面命令:
read city #窗口会等待输入信息,然后赋值给city这个变量
read city;echo "I love $city"; #你输入的信息被赋值给city这变量,如果输入BeiJing,屏幕会输出 I love BeiJing
2.标准输出就是命令行的信息输出到屏幕或者声音设备中,英文standard out 缩写stdout ,linux用文件符号1表示,如下面命令会产生标准输出到屏幕
echo BeiJing #输出 BeiJing
date #输出当前日期
ls -l /usr/bin #输出/usr/bin目录的内容信息
3.标准错误就是产生的错误会自动输出到屏幕中,英文standad error 缩写stderr,linux用文件符号2表示,如下命令会产生错误并输出到屏幕:
ls -l /usr/bin/xxx #/usr/bin/xxx目录不存在屏幕输出错误 ls: cannot access /usr/bin/xxx: No such file or directory
重定向
1.标准输入重定向 符号 <
如上面的 read city;echo “I love $city”; 我们必须要从键盘输入一个城市名称
如果我们新建一个文件 vim city.txt ,并且输入BeiJing 保存退出
用输入重定向把 文件里面的内容给city变量:
vim city.txt #输入一个城市如BeiJing 保存退出
read city < city.txt ;echo "I love $city"; #这时city.txt 内容会给到city 然后屏幕直接输出 I love BeiJing
2.标准输出重定向 符号>
如上面的echo BeiJing 屏幕会显示BeiJing,如果我们不希望输出到屏幕可以这样:
echo BeiJing > beijing.txt #此时 会生成一个文件并且内容是BeiJing
cat beijing.txt #查看文件内容
ls -l /usr/bin >usr-bin.txt #目录/usr/bin的内容会输出到usr-bin.txt文件中
重定向符号> 会每次覆盖文件内容,如果希望追加内容可以使用>> 如:
echo BeiJing >> beijing.txt
echo BeiJing >> beijing.txt
echo BeiJing >> beijing.txt
cat beijing.txt #此时会有多行beijing
3.标准错误重定向 文件描述符 2紧跟 >输出重定向符号,既:2>
如执行
ls -l /usr/bin/xxx # /usr/bin/xx 不存在 屏幕输出错误:ls: cannot access /usr/bin/xxx: No such file or directory
但我们不希望它输出错误,而是希望它把错误保存在一个日志文件,我们有空再定时排查,这个在linux执行一些shell定时任务脚本是很有用的。
ls -l /usr/bin/xxx 2> error.log #此时会生成error.log文件,并且内容是 ls: cannot access /usr/bin/xxx: No such file or directory
cat error.log #查看错误日志内容
ls -l /usr/bin/xxx 2>> error.log #追加错误信息到error.log 而不是每次都覆盖掉
4.标准输出和标准错误同时重定向到一个文件
上面说到
ls -l /usr/bin >usr-bin.txt #会把标准输出内容重定向到usr-bin.txt
ls- l /usr/bin/xxx 2> error.log #会把标准错误内容重定向到error.log
那么有没有方法不管命令错误还是正常都把内容输出到一个test.txt 文件?
方法有两个:
ls -l /bin/usr/test > test.txt 2>&1 #老版本shell命令
#如果/bin/usr/test 存在则内容输出到test.txt 中,
#如果不存在则错误内容也输出到test.txt 中,
#后面的 2>&1 ,2表示标准错误 , >表示重定向,&表示取址,1表示标准输出,合起来就是把标准错误也重定向到标准输出,然后标准输出给 test.txt 文件
ls -l /bin/usr/test &> test.txt #新版本shell更简单的合并命令
处理不想要的输出 黑洞/dev/null
如果我们执行一段linux命令,我们既不想要它把标准输出或者标准错误打印打到屏幕,也不想要它重定向保存到文件中.,可以采用/dev/null ,这是linux特殊文件,称为位桶(bit bucket),也有点像黑洞,不管丢什么东西进去都会不见了.
echo Hello > /dev/null # 标准输出重定向到/dev/null 屏幕不会有输出 /dev/null也不会有内容
cat /dev/null #不会得到任何信息
ls -ls /usr/bin > /dev/null
ls -ls /usr/bin/xxx 2> /dev/null #/usr/bin/xxx 目录不存在,把错误信息重定向到/dev/null 这样屏幕既不会输出错误信息,我们也不需要把错误信息保存到文件中