0


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

前言

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

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

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

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

1.1、&的作用

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

语法格式:command1 &

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

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

【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 、grep、wc等命令组合在一起使用 。

示例一:配合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的区别

标签: linux java 运维

本文转载自: https://blog.csdn.net/xp871038951/article/details/127355545
版权归原作者 血煞长虹 所有, 如有侵权,请联系我们删除。

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

还没有评论