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

Posted 血煞长虹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 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的区别

bash小技巧

Linux 下shell基本上默认是 bash, 下面是我总结的一些技巧。

&  后台运行程序 ,注意退出当前shell后 程序也会退出
()   使用子shell, 比如 (cd ../../commlib/; make) 
$()  命令替换,和 ``的作用是一样的 
<(命令)  把命令的输出到一个临时文件 
<< HereDoc

使用举例:

比如你要在 shell 脚本中 使用 awk 脚本 
awk -f <(cat <<EOF

  /abc/{

   print $0;


EOF 
)

$(())  执行整数计算 $((66/2)) 
if (( 算术运算 )) 
if [[ 字符串运算 ]]


alias 定义命令别名

.  或 source 命令, 在当前shell中执行脚本,.点执行脚本会生成子shell,source会在当前shell在,所以申明环境变量的时候使用source,

exec 可以重定向当前shell的文件描述符, 或运行另一个程序。


trap 可以捕获信号 查看信号

nohup 防止ssh 挂起导致的问题 
screen 可以用来保持 会话,  不受ssh的关闭影响

export 导出变量给子shell使用

tee 可以 把 输出 分流  

1 ps -ax | tee processes.txt | more

 

ENV_VAR=VALUE your_program 这样可以 为这一个程序 修改它环境变量,外部shell的环境变量没有被更改


tac 倒置文件 (倒序)

 

快速跳至常用目录

     你可能已经知道$PATH变量可以列出 bash的“搜索路径”——当在当前目录不能找到请求的文件时,bash会自动搜索的目录。不过,bash也支持$CDPATH变量,当试图改变目录时该变量列出cd命令转向的目录。为了使用这个特性,我们要对$CDPATH变量赋值一个目录列表,如下面的例子所示:

bash> CDPATH=‘.:~:/usr/local/apache/htdocs:/disk1/backups‘

bash> export CDPATH

现在,无论何时使用cd命令,bash将会检查$CDPATH列表中的所有目录来查找要转向的目录名。(默认是家目录)

 

bash快捷键

 

其它 
ctrl+h:删除光标前一个字符,同 backspace 键相同。 
alt + p 非增量方式反向搜索历史 
alt + > 历史命令列表中的最后一行命令开始向前 
ctrl+u: 清除光标前至行首间的所有内容。 
ctrl+w: 移除光标前的一个单词 
ctrl+t: 交换光标位置前的两个字符 
ctrl+y: 粘贴或者恢复上次的删除 
ctrl+l:清屏,相当于clear。 
ctrl + xx 光标在行头与行尾进行跳转 
alt+r 撤销当前行的所有内容 
ctrl+z : 把当前进程转到后台运行 
ctrl+s : 锁住屏幕 
ctrl+q : 恢复屏幕 
ctrl+v key: 输入特殊字符 
alt + l 将当前光标处之后的字母转化成小写字母 
alt + u 将当前光标处之后的字母转化成大写字母 
ctrl + Alt + e 扩展命令行的内容(例如:ls  =>  ls  -l  --color=tty) 
ctrl+c:杀死当前进程, 输入模式下,中断输入的命令。 
ctrl+d:退出当前 Shell 
esc + . 快捷键可以轮询历史命令的参数或选项。 
esc + t 快捷键可以 置换前两个单词。 
输入重复字母 Esc {100} e 可以输入100个e字符

按多次{esc}可以补全 
{esc}{~}可以补全本机上的用户名 
{esc}{/}可以补全文件名 
{esc}{@}可以补全主机名,localhost可以方便地用 lo补全.

 

历史命令

crtl +r  搜索历史命令

!!    重新执行上一条命令 
!N  重新执行第N条命令。比如 !3 
!-N 重新执行倒数第N条命令。!-3 
!string  重新执行以字符串打头的命令。 比如 !vim 
!?string?  重新执行包含字符串的命令。 比如 !?test.cpp? 
!?string?%  替换为: 最近包含这个字符串的命令的参数。比如:   vim !?test.cpp?% 
!$   替换为:上一条命令的最后一个参数。比如 vim !$ 
!!string  在上一条命令的后面追加 string ,并执行。 
!Nstring  在第N条指令后面追加string,并执行。 
^old^new^  对上一条指令进行替换 
修饰

:s/old/new/  对第N条指令中第一次出现的new替换为old。 比如 vim !?test.cpp?:s/cpp/c/ 
:gs/old/new/  全部替换 
:wn  w为数字, 取指令的第w个参数. 
:p 回显命令而不是执行, 比如 !ls:p  。 这个很有用, 你可以先查看你选的命令对不对,要执行时再使用!!

定制shell提示符
你可以定制bash shell提示符以显示当前用户名和主机名、当前时间、平均负载和/或当前工作目录。要实现这一点,像下面这样改变$PS1变量:
bash> PS1=’\[email protected]\h:\w \@> ‘
bash> export PS1
[email protected]:/tmp 03:01 PM>

 

jobs 查看后台程序

fg 将后台程序调到前台

bg 将程序调到后台

crtl +s 锁窗口

crtl +q 解锁窗口

命令行光标移动

^P 、^N、 ^B、 ^F      方向键 上 下 左 右

Alt+shift+F          光标右移一个单词  又可能会和terminal的快捷键冲突

Alt+shift+B          光标左移一个单词

^A 、^E         光标移至行首 行尾

删除命令

^k   清楚光标后至行尾的内容

^u   清楚光标前至行首的内容

^b   删除光标所在的字母

^h   删除光标前一个字符

^w   删除光标前一个单词

^y   粘贴或恢复上次的删除、

^t 或者ESC+t 置换光标位置前的两个字符

ALT+L 将光标后面的字母小写

ALT+U 大写

以上是关于Linux技巧:命令尾部&的作用 &&|||;()&> 2>&1 的用法和区别,很实用的主要内容,如果未能解决你的问题,请参考以下文章

bash小技巧

Linux shell中运行命令后加上字符“&”的作用

Linux shell中运行命令后加上字符“&”的作用

linux后台运行程序--nobup

Linux 文件权限用户权限和用户组管理&vim的一些基本使用技巧

Linux常用命令(十六)