1、Shell 中的两个特殊文件“/dev/null”和“/dev/tty”
/dev/null
当被用作重定向输出时,程序的输出被直接丢弃。该文件用在哪些不关心程序输出的地方。
当被用作重定向输入时,输入则是文件结束。- /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
$