[授之以渔]Linux中的 &,&&,|,||,,>>,2>&1

& 和 &&

& 指定当前任务在后台执行
例如我们启动redis

/usr/bin/redis-server /etc/redis.conf &

&& 前一条命令执行成功后才执行后一条命令

 echo 'my name ' && echo 'is lily' 

| 和 ||

| 管道符,前一条命令的结果传递给后一条命令作为参数

 ls |grep 'php' 

|| 前一条命令执行错误后才执行后一条命令

 ls hnuehuneoh || echo 'is lily' #hnuehuneoh文件不存在 

> 和 >>

>  输出重定向 ,覆盖原有内容

echo 'first' > b.log && cat b.log
echo 'second' > b.log && cat b.log

>> 输出重定向 ,追加内容

echo 'first' >> b.log && cat b.log
echo 'second' >> b.log && cat b.log

<  输入重定向
把后面指定的文件输入给运行时需要输入的程序
例如我们有一个shell程序 a.sh 内容如下

#!/bin/bash
read INPUT
echo "Input content \" $INPUT \" !"

准备一个写有内容的文件 input.log

[root@localhost ~]#  echo 'My name is lily' > input.log

执行如下命令会发现, input.log 文件内的内容被当做了输入

[root@localhost ~]#  sh a.sh < input.log
Input content " My name is lily "

2>&1 和 &>file

0 表示stdin标准输入
1 表示stdout标准输出
2 表示stderr标准错误

从一个例子说起:
找一个目录,目录中有a.php 文件, 没有 b.php文件, 我们认识一下什么是”标准错误”,什么是”标准输出”

[root@localhost ~]# ls a.php b.php
ls: cannot access b.php: No such file or directory   #标准错误
a.php  #标准输出

如下命令中 1> 表示”标准输出”输出到 output.log文件中

[root@localhost ~]# ls a.php b.php 1> output.log
ls: cannot access b.php: No such file or directory
[root@localhost ~]# cat output.log
a.php

如下命令中 2> 表示”标准错误”输出到 output.log文件中

[root@localhost ~]# ls a.php b.php 2> output.log
[root@localhost ~]# cat output.log
ls: cannot access b.php: No such file or directory

下面的例子代表”标准输出”输出到 output.log , “标准错误”输出到 output2.log

[root@localhost ~]# ls a.php b.php 1> output.log 2> output2.log
[root@localhost ~]# cat output.log
a.php
[root@localhost ~]# cat output2.log
ls: cannot access b.php: No such file or directory

1> 可以简写成 >

ls a.php b.php > output.log
ls a.php b.php 1> output.log

回到2>&1 , 如下例子

[root@localhost ~]# ls a.php b.php > output.log  2>&1
[root@localhost ~]# cat output.log
ls: cannot access b.php: No such file or directory
a.php

上例中 & 相当于”等效于”,可以理解为 [标准错误]的输出[等效于][标准输出], 换句话说”标准输出”到哪儿”标准错误”就输出到哪儿
下面的例子 &> 代表 “标准输出”,”标准错误” 都输出到 output.log

ls a.php b.php &> output.log

返回目录