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 、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中。
语法格式:(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日常更上一层楼。
如果觉得相当不错,整理不易,赶快点赞收藏吧!
附注
猜你可能感兴趣
1、RHEL7/8、CentOS7/8的下载 | Yum源配置
2、RHEL7/Centos8 | 配置动/静态IP| ping: unknown host www.baidu.com 详解
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 的用法和区别,很实用的主要内容,如果未能解决你的问题,请参考以下文章