【Shell】特殊文件和标准输入输出

1、Shell 中的两个特殊文件“/dev/null”和“/dev/tty”

  1. /dev/null
    当被用作重定向输出时,程序的输出被直接丢弃。该文件用在哪些不关心程序输出的地方。
    当被用作重定向输入时,输入则是文件结束。

  2. /dev/tty
    当被用作重定向时,表示重定向到终端。

基本命令查找

shell 会沿着$PATH 来寻找命令。$PATH 是一个以冒号分割的目录列表,你可以在列表所指定的目录下找到所要执行的命令。命令可能是 shell 脚本,也可能是编译后的可执行文件,从用户角度来看,二者并无不同。
默认路径至少包含/bin 和/usr/bin,或许还包含其他的。
名称为 bin 的目录用来保存可执行文件。

如果要编写自己的脚本,最好准备一个自己的 bin 目录来存放他们,并且让 shell 能够自动找到他们。

$cd  
$mkdir bin   
$mv nusers bin  
$PATH+$PATH:$HOME/bin         //将个人的 bin 目录附加到 PATH(暂时生效,系统重启后失效)  
nusers

要想永久生效,在/etc/profile 文件中把你的 bin 目录加入到$PATH,而每次登陆时 Shell 都将读取.profile 文件。
PATH=$PATH:$HOME/bin
$PATH 里的空项目表示当前项目。空项目位于路径中间时,可以用两个连续的冒号来表示,如果将冒号直接置于最前端或尾端,分别表示查找的时候最先查找或最后查找当前目录。

$PATH=:/bin:/usr/bin            先找当前目录  
$PATH=/bin::/usr/bin            当前目录居中  
$PATH=/bin:/usr/bin:            最后找当前目录  

<,>,>>以及| 是基本的 I/O 重定向符

重定向的使用规律

  • 标准输入0、输出1、错误2需要分别重定向,一个重定向只能改变它们中的一个
  • 标准输入0和标准输出1可以省略。(当其出现重定向符号左侧时)
  • 文件描述符在重定向符号左侧时直接写即可,在右侧时前面加&
  • 文件描述符与重定向符号之间不能有空格

2、在shell里面>&2是什么意思?

>箭头代表重定向
&代表引用
2表示STDERR标准错误输出
0表示STDIN标准输入
1表示STDOUT标准输出

那你这个 >&2 的含义:把前面的打印消息重定向到标准错误里面。(错误信息才输出)

Shell会自动为我们打开和关闭0、1、2这三个文件描述符,我们不需要显式地打开或关闭它们。标准输入是命令的输入,默认指向键盘;标准输出是命令的输出,默认指向屏幕;标准错误是命令错误信息的输出,默认指向屏幕。

"某个命令" 1>/dev/null 2>&1

执行这个命令,然后这个命令执行过程中的所有标准输出都重定向到/dev/null,空设备的意思就是标准输出不打印,

2>&1 就是标准错误重定向到标准输出中。而标准输出前面已经说了不打印。那么整体就是标准输出,标准错误都不打印。

如果没有前提“而标准输出前面已经说了不打印”,2>&1  意思就很明了了,就是讲执行linux命令时的错误信息也输出到屏幕上。

>&2 使用的比较少,我们很少把其他信息重定向到标准错误中。

https://wiki.jikexueyuan.com/project/shell-learning/sectionalization.html

3、实践

这里使用(echo 1; echo1 1)命令测试

$ (echo 1; echo1 1)
1
bash: echo1: command not found

# 可以看到标准输出进了1.log,标准输入0和标准输出1可以省略。(当其出现重定向符号左侧时)
$ (echo 1; echo1 1)>1.log
bash: echo1: command not found
$ cat 1.log
1

# 可以看到标准输出进入了1.log,标准错误进入了2.log
$ (echo 1; echo1 1) 1>1.log 2>2.log
$ cat 1.log
1
$ cat 2.log
bash: echo1: command not found

# 表示把错误出定向到标准输出(此时标准输出为终端,所以输出到终端), 标准输出定位到文件( >1.log其实是1>1.log),所以看到错误信息输出到终端,而正确信息保存到了1.log
$ (echo 1; echo1 1) 2>&1 >1.log
bash: echo1: command not found
$ cat 1.log
1

# 把上面的位置调换下,先把标准输出定位到1.log
# 把标准输出定位到文件,错误输出到标准输出(此时标准输出指向文件,所以输出到文件)
$ (echo 1; echo1 1) >1.log 2>&1
$ cat 1.log
1
bash: echo1: command not found


# /dev/null 代表空设备文件,我们经常把输出定位到/dev/null这样可以避免程序不必要的打印。
# 这样把标准输出定位到空,再把标准错误定位到标准输出。
$ (echo 1; echo1 1) >/dev/null 2>&1
$

linux中的标准输出和输入

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值