Bash中的特殊字符大全
相关链接: Bash 中的特殊字符大全 、 对话 UNIX: !$#@*%
>
、>>
、&>
、>&
、&
标准输入输出 、 重定向 、 Shell 输入/输出重定向
介绍
执行一个shell命令行时通常会自动打开三个标准文件,即标准输入文件(stdin),通常对应终端的键盘;标准输出文件(stdout)和标准错误输出文件(stderr),这两个文件都对应终端的屏幕。
进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。
>
:输出重定向,覆盖。>
相当于 1>
,前面默认有个 1
,表示标准输出重定向,不包括标准错误。
左边的命令应该有标准输出 > 右边只能是文件
scriptname > filename
:将 scriptname 的标准输出重定向到 filename 文件,若文件不存在则创建。
echo "123" > /home/123.txt
:将 “123” 输出到 123.txt 文件中。
>>
:输出重定向,追加。>>
相当于 1>>
,前面默认有个 1
,表示标准输出重定向并追加,不包括标准错误。
scriptname >> filename
将 scriptname 的标准输出以追加的方式重定向到 filename 文件,若文件不存在则创建。
/dev/null
代表空设备文件,垃圾桶,类似windows的回收站。
0
:表示 stdin(Standardinput)标准输入。
1
:表示 stdout(Standardoutput)标准输出,系统默认值是1,所以 >/dev/null
等同于 1>/dev/null
。
2
:表示 stderr(Standarderror)标准错误输出。
>&
:这里的 &
表示等同于的意思,2>&1
表示 2 的输出重定向(等同于)到 1 ,2 和 1 的输出合并。
&>
:这里的 &
表示标准输出和标准错误输出,
&
:单一个 &
符号放在命令的末尾,表示该命令转到后台执行。对于这样的命令,系统会创建一个 sub-shell 来运行这个命令,这个命令会立刻返回0并继续执行下面的 shell 命令。除此之外,在执行这个命令之后,terminal上会输出创建的sub-shell的线程ID(PID)。
1 | [root@jonsnows home]# uname & echo 'asd' |
Linux Shell 1>/dev/null 2>&1
含义
1>/dev/null
:表示标准输出重定向到空设备文件,也就是不输出任何信息到终端。2>&1
:表示标准错误输出重定向(等同于)到标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。
1>/dev/null 2>&1
的简化版本 &>/dev/null
,但不适用 bourne shell 。
cmd >a 2>a
和 cmd >a 2>&1
不同
cmd >a 2>a
:stdout和stderr都重定向到文件 a ,文件 a 会被打开两次,两个管道,由此导致stdout和stderr互相覆盖。cmd >a 2>&1
:stderr重定向到stdout,stdout重定向到文件 a。a文件只被打开一次,共用一个管道。
2>&1
和 2>1
2>1
:这里的 1 表示的是文件 1 ,并不代表标准输出。
2>&1
:&
与 1
结合就代表标准输出,变成标准错误重定向到标准输出。
1 | ls 2>1 # 不会报没有2文件的错误,但会输出一个空的文件1; |
2>&1
放在 >
前
2>&1 >/dev/null
,可以这么写,但并不能达到我们想要的效果。因为当解释器读到 2>&1
, 它并不知道标准输出被重定向到垃圾桶,此时标准输出还在终端,所以标准错误输出并没有和后面的标准输出融合。
2>&1 >/dev/null
:错误输出到终端,标准输出被重定向到垃圾桶。
1 | [root@localhost home]# ls aaa 2>&1 >output.txt |
应用
1 | 启动java服务 |
等价于
1 | 启动java服务,不适用 bourne shell |
管道 |
管道可以把一系列命令连接起来,前一个命令的输出作为后一个命令的输入。
左边的命令应该有标准输出 | 右边的命令应该接受标准输入
1 | command1 | command2 |
等价于:
1 | command1 > tempfile |