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
2
3
4
5
6
7
8
[root@jonsnows home]# uname & echo 'asd'
[1] 4848
asd
[root@jonsnows home]# Linux
pwd
/home
[1]+ Done uname
[root@jonsnows home]#

Linux Shell 1>/dev/null 2>&1 含义

重定向

1>/dev/null :表示标准输出重定向到空设备文件,也就是不输出任何信息到终端。
2>&1 :表示标准错误输出重定向(等同于)到标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。

1>/dev/null 2>&1 的简化版本 &>/dev/null ,但不适用 bourne shell 。

cmd >a 2>acmd >a 2>&1 不同

cmd >a 2>a :stdout和stderr都重定向到文件 a ,文件 a 会被打开两次,两个管道,由此导致stdout和stderr互相覆盖。
cmd >a 2>&1 :stderr重定向到stdout,stdout重定向到文件 a。a文件只被打开一次,共用一个管道。

2>&12>1

2>1 :这里的 1 表示的是文件 1 ,并不代表标准输出。

2>&1&1 结合就代表标准输出,变成标准错误重定向到标准输出。

1
2
3
4
ls 2>1 # 不会报没有2文件的错误,但会输出一个空的文件1;
ls xxx 2>1 # 没有xxx这个文件的错误输出到了1中;
ls xxx 2>&1 # 不会生成1这个文件了,不过错误跑到标准输出了;
ls xxx >out.txt 2>&1 # 等价于 ls xxx 1>out.txt 2>&1;错误和输出都输出到out.txt。

2>&1 放在 >

2>&1 >/dev/null ,可以这么写,但并不能达到我们想要的效果。因为当解释器读到 2>&1, 它并不知道标准输出被重定向到垃圾桶,此时标准输出还在终端,所以标准错误输出并没有和后面的标准输出融合。

2>&1 >/dev/null :错误输出到终端,标准输出被重定向到垃圾桶。

1
2
3
4
5
6
[root@localhost home]# ls aaa 2>&1 >output.txt
ls: cannot access aaa: No such file or directory
[root@localhost home]# ls
output.txt
[root@localhost home]# cat output.txt
[root@localhost home]#

应用

1
2
# 启动java服务
nohup java -jar -Dserver.port=9088 gateway.jar >/dev/null 2>log &

等价于

1
2
# 启动java服务,不适用 bourne shell
nohup java -jar -Dserver.port=9088 gateway.jar &>/dev/null &

管道 |

管道 (Unix)

管道可以把一系列命令连接起来,前一个命令的输出作为后一个命令的输入。

左边的命令应该有标准输出 | 右边的命令应该接受标准输入

1
command1 | command2

等价于:

1
2
3
command1 > tempfile
command2 < tempfile
rm tempfile