前言
在使用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、使用&启动服务时,服务会以后台进程的形式在后台运行,并且会将输出重定向到终端之外的标准输出中,服务进程的输出信息只能在终端关闭前查看,之后无法再次查看;-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 hellobash: data: 未找到命令...[root@centOS7 ~]# date && echo hello2022年 10月 17日 星期一 00:07:01 CSThello
注意:它的特性是“下一条命令,依赖前一条命令是否执行成功 ”,所以前后关系较为密切的一些组合命令中,经常发现他们的身影。
比如: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 -l2[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/hostnamebash: data: 未找到命令...hello2022年 10月 17日 星期一 00:34:05 CSTcentOS7[root@centOS7 ~]#
六、“()”拼接符的作用
作用:把多个命令,当做一个整体执行,同时增强了可读性。
通常情况下,多个命令用“;”分隔后,最外层再用“()”包裹一下,通常用在稍微复杂点的shell中。
语法格式:(command1;command2;command3;...)
七、“>”连接符的作用
作用:把正常信息(剔除错误信息)重定向到另一个文件内
注意:如果每次都是重定向到同一个文件,它的效果是覆盖原文件信息,不是内容追加!
#切换到指定目录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日常更上一层楼。
如果觉得相当不错,整理不易,赶快点赞收藏吧!
附注
猜你可能感兴趣
RHEL7/Centos8 | 配置动/静态IP| ping: unknown host www.baidu.com 详解
查看系统内核/操作系统版本详解_查看内核版本_血煞长虹的博客-CSDN博客
seq命令 / mkdir -p 批量创建/删除文件夹 详解
Linux sort命令深入解析 | sort -k M.m,N.n 命令详解
用head tail sed 查看第N行到最后一行 | m,n行区间/固定行 | 前/后N行(以外)的内容
开启/关闭网卡(混合模式) | 设置网卡队列长度/最大传输单元 | 修改/删除eth0默认网关 |设置/删除默认路由 | 根据域名查看DNS地址(网卡 | IP 篇)
shell脚本实战 | 6个入门级shell脚本(CPU负载、监控、计划任务)
Shell编程:/bin/bash和/bin/sh的区别_/bin/bash /bin/sh的区别
来源地址:https://blog.csdn.net/xp871038951/article/details/127355545