关于Linux IO 重定向

it2025-02-02  7

关于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 这样屏幕既不会输出错误信息,我们也不需要把错误信息保存到文件中
最新回复(0)