Linux技巧(六):命令尾部&的作用 &&、|、||、;、()、&>、 2>&1 的用法和区别,很实用

前言

在使用Linux命令时,&&、||、;、()这些偶尔会接触到,命令结尾单独的“&”符号,又有什么作用,这些命令之间有何区分,一起来学习一下吧。

bin/zookeeper-server-start.sh config/zookeeper.properties &

 【PS】:如果你对Zookeeper学习:ZK下载安装和真/伪集群搭建感兴趣,点击进入。

一、命令尾部,单独“&”的作用

1.1、&的作用

作用:表示任务在后台执行,即使ssh窗口关闭,服务依然会在后台持续运行。

语法格式:command1 &

注意:默认情况下,进程是前台进程,这时就把Shell给占据了,此时Shell窗口无法进行其他操作。通常情况下,对于那些没有交互的进程,很多时候,我们希望将其在后台启动,此时可以在启动时,参数尾部加一个’&‘或者’-d‘实现这个目的。

#docker run -d -p 8000:8080 tomcat 后台阻塞运行(如果没有-d,窗口被关闭,服务也会随之关闭)

当然,两者也可以混合式使用,比如:./MediaServer -d & 

扩展:单独使用d&参数启动服务时的区别和联系
1、-d参数启动服务时,服务会以守护进程的形式在后台运行,并且会将输出重定向到系统日志或指定的日志文件中,便于后续查看;
2、使用&启动服务时,服务会以后台进程的形式在后台运行,并且会将输出重定向到终端之外的标准输出中,服务进程的输出信息只能在终端关闭前查看,之后无法再次查看;

3、-d参数启动服务时,可以使用service命令来查看和管理服务,包括查看服务状态、重启服务等;
4、使用&启动服务时,如果需要查看服务状态或停止服务,需要使用ps命令和kill命令,较为繁琐。 

【PS】:如果你对Docker学习:Docker命令的使用,感兴趣,点击进入。 

1.2、nohup的作用

nohup是no hang up 的缩写,即:不挂断的意思,关闭终端界面后,进程继续后台运行。

语法格式:nohup Command [ Arg … ] [ &

注意事项:

1)使用nohup命令时,需添加 &( “and”符号)到命令的尾部。

2)使用nohup命令时,如果直接在shell中使用ctrl + c 或ctrl + z时,进程会结束!!!

3)nohup命令默认输出重定向目录,是当前目录的nohup.out文件中;如果当前目录的 nohup.out 是只读的,则自动重定向输出到$HOME/nohup.out 文件中。 


[root@centOS7 ~]# nohup ./startup.sh >output 2>&1 & 

拓展:tomcat、nginx等都是通过startup.sh启动服务的。

二、“&&”命令的作用

作用:表示前一条命令执行成功时,才执行后一条命令;反之,前面的命令执行失败,则&&后面的命令不会被执行。

语法格式:  command1 && command2  [&& command3 …]

示例 

[root@centOS7 ~]# data && echo hello
bash: data: 未找到命令...
[root@centOS7 ~]# date && echo hello
2022年 10月 17日 星期一 00:07:01 CST
hello

注意:它的特性是“下一条命令,依赖前一条命令是否执行成功 ”,所以前后关系较为密切的一些组合命令中,经常发现他们的身影。

比如:expect的安装,需要先安装依赖,如果合并为一条命令,此时就用上&&了。 

三、“|”管道的作用

作用:| 表示管道,上一条命令的输出,作为下一条命令参数,通常用来过滤/汇总数据。

语法格式:  command1 |  command2  [ | command3 … ]

注:| 根据需求,可以在一条命令中连续被使用,它通常和find grepwc等命令组合在一起使用 。

示例一:配合grep,完成过滤

#过滤出占用端口9092的程序(kafka)
netstat -nalpt | grep 9092

示例二:配合wc完成统计

 echo 'yes' | wc -l
 echo 'yes' | wc -m

  

示例三:连续使用管道

[root@centOS7 ~]# cat /etc/passwd | grep /bin/bash | wc -l
2
[root@centOS7 ~]# 

  

四、“||”拼接符的作用

作用:表示上一条命令执行失败后,才执行下一条命令。一旦执行到一条成功的命令,后面用||连接的命令,就不会再被执行。

语法格式:  command1 | | command2  [ | |command3 … ] 

注意:只要上一条命令执行成功,则下一条命令不会被执行。 

注:||后面的命令,有点儿托底的意思,类似于java中的 try,catch。 

[root@centOS7 ~]# cat nofile || echo "hi,succ"
cat: nofile: 没有那个文件或目录
hi,succ
[root@centOS7 ~]# cat /etc/hostname || echo "hello succ"
centOS7
[root@centOS7 ~]# 

五、“;”拼接符的作用

作用:把多条命令,拼接在一起后执行,可减少(人机)交互次数。

语法格式:command1;command2  [ ;command3 … ] 

注意:;号隔开每个命令, 每个命令按照从左到右的顺序执行, 但是彼此之间不关心是否失败, 所有命令都会执行。 

[root@centOS7 ~]# data;echo 'hello';date;cat /etc/hostname
bash: data: 未找到命令...
hello
2022年 10月 17日 星期一 00:34:05 CST
centOS7
[root@centOS7 ~]# 

 

六、“()”拼接符的作用 

作用:把多个命令,当做一个整体执行,同时增强了可读性。

通常情况下,多个命令用“;”分隔后,最外层再用“()”包裹一下,通常用在稍微复杂点的shell中。

语法格式:(command1command2command3)

七、“>”连接符的作用

作用:把正常信息(剔除错误信息)重定向到另一个文件内

 注意:如果每次都是重定向到同一个文件,它的效果是覆盖原文件信息,不是内容追加!

#切换到指定目录
cd mypackage && ls
#根据名称查找文件,并把符合条件的名称,重定向输入到tar.txt中
find -name "*.tar.*" > tar.txt
#查看
ls ; cat tar.txt

注:如果每次都需要把内容追加到文件中,则需要用>> 

八、“&>”、“>” 作用和区别 

> 或1> 作用:  仅正常信息(非异常信息,非报错信息),重定向输出到指定文件;

2>作用:仅将错误信息重定向输出到指定文件中;

&>或2>&1作用:同时将错误信息、普通信息一并重定向输出到指定文件。

[root@CentOs7]# lll
-bash: lll: command not found   //由于Linux没有lll这个命令所以会显示错误信息,这个就是stderr输出的错误信息
[root@CentOs7]# lll >test.txt
-bash: lll: command not found  //由于这个是错误信息  所以不能使用标准输出>将信息重定向到test.txt文件中
[root@CentOs7]# lll&>test.txt  //使用&>重定向 ,会一并把错误信息、正确信息,一并重定向到了test.txt文件
[root@CentOs7]# cat test.txt
-bash: lll: command not found  //通过cat命令确实看到了  保存的错误信息 

注意:如果每次都是重定向到同一个文件,以上两个命令的效果都是覆盖原文件信息,不是内容追加! 

说明:可把错误、异常信息同时输出到两个不同的文件。

make xxx 1> normal.txt  2> error.txt

1.深入了解&>2>&1

简而言之,&>>&的作用相同,都是把标准信息+错误信息重定向到指定位置,它们都是2>&1的简写写法

但是在日常开发、学习过程中,习惯上更偏向于使用&>

虽然它们的效果相同,然而在使用上,还是略有差异的,强烈建议直接使用&>即可。

注意:如果你偏向于使用2>&1,则它需要写在重定向文件的后面,否则达不到你想要的效果,示例(须知:date是正确命令,data是故意制造的错误命令):

1)错误用法:(data;echo “hello”;date;cat /etc/hosts)  2>&1 >a.txt   #写在前面

2)正确用法:(data;echo “hello”;date;cat /etc/hosts) > b.txt  2>&1   #写在后面

3)简写示例

注意事项:简写模式&>只能放在文件前面,不能放后面,否则会提示语法错误!

九、linux重定向

9.1、Linux常用的三个流

名称  代码 操作符Java中表示Linux 下文件描述符
标准输入(stdin) 0< 或 << System.in /dev/stdin -> /proc/self/fd/0 -> /dev/pts/0
标准输出(stdout) 1>, >>, 1> 或 1>> System.out/dev/stdout -> /proc/self/fd/1 -> /dev/pts/0
标准错误输出(stderr) 2 2> 或 2>>  System.err /dev/stderr -> /proc/self/fd/2 -> /dev/pts/0 

0 是标准输入stdin,一般是从键盘获得输入

1 是标准输出stdout,一般是输出到屏幕了

2 是标准错误输出stderr,一般是输出到屏幕,重定向到文件中后,屏幕就看不到它了 

9.2、常用的重定向符号

>   将正常的信息,重定向到某个文件/设备中(会覆盖文件原有信息)

>>  将正常的信息,重定向到某个文件/设备中(不会覆盖文件原有信息,只会追加)

&> 将正常+异常信息,一并重定向到某个文件/设备中(会覆盖文件原有信息)

&>>将正常+异常信息,一并重定向到某个文件/设备中(不会覆盖文件原有信息,只会追加)

2> 只输出错误信息到某个文件/设备中

还有一些较少会用到的,比较烧脑,n<&- 和>&n以及<&-感兴趣,可以单独去了解一下。

记忆小妙招:

看到有两个尖括号的,代表是内容追加,单个尖括号,之前的内容都会被覆盖!!!

9.3、/dev/null 黑洞 

/dev/null 是一个特殊的设备文件,这个文件接收到任何数据都会被丢弃,俗称“黑洞”

它非常等价于一个只写文件,所有写入它的内容都会永远丢失,而尝试从它那儿读取内容则什么也读不到,然而,/dev/null对命令行和脚本都非常的有用。 

黑洞的使用场景:

如果不想把正确/错误信息,输出到屏幕时,就可以把这部分信息输出到黑洞中。 

 1> /dev/null 经将正常信息出入到黑洞

 echo "httpd server is running" >> /dev/null  #如果不希望将信息打印到屏幕,可以输出到黑洞

2> /dev/null意思就是把错误输出到“黑洞” ,不会显示在屏幕上。

总结

本文较为全面的介绍了Linux常用连接符 &、&&、;、| 、|| 、()、>、&>的区别和作用。

尾言

有效的掌握这些连接符的使用,可以大大提升自己的内力,让你的linux日常更上一层楼。

如果觉得相当不错,整理不易,赶快点赞收藏吧!

附注

猜你可能感兴趣

1、RHEL7/8、CentOS7/8的下载 | Yum源配置

2、RHEL7/Centos8 | 配置动/静态IP| ping: unknown host www.baidu.com 详解

3、临时修改主机名 | 永久修改主机名 | 详解

4、查看系统内核/操作系统版本详解_查看内核版本_血煞长虹的博客-CSDN博客

5、seq命令 / mkdir -p 批量创建/删除文件夹 详解

6、Linux sort命令深入解析 | sort -k M.m,N.n 命令详解

7、用head tail sed 查看第N行到最后一行 | m,n行区间/固定行 | 前/后N行(以外)的内容

8、开启/关闭网卡(混合模式) | 设置网卡队列长度/最大传输单元 | 修改/删除eth0默认网关 |设置/删除默认路由 | 根据域名查看DNS地址(网卡 | IP 篇)

9、shell脚本实战 | 6个入门级shell脚本(CPU负载、监控、计划任务)

10、Shell编程:/bin/bash和/bin/sh的区别_/bin/bash /bin/sh的区别

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2023年12月8日
下一篇 2023年12月8日

相关推荐