Home Archives Categories Tags

Linux Shell的 & 、&& 、 ||

发布时间: 更新时间: 总字数:1357 阅读时间:3m 作者: 分享

总结一下shell的&、&&、||

& 用法

& 放在启动参数后面表示设置此进程为后台进程,默认情况下,进程是前台进程,这时就把Shell给占据了,我们无法进行其他操作,对于那些没有交互的进程,很多时候,我们希望将其在后台启动,可以在启动参数的时候加一个’&‘实现这个目的。

如:

[root@xiexianbin_cn ~]# run &
[1] 18502
[root@xiexianbin_cn ~]#

进程切换到后台的时候,我们把它称为job。切换到后台时会输出相关job信息,以前面的输出为[1] 18502:[1]表示job ID是1,18502表示进程ID是18502。切换到后台的进程,仍然可以用ps命令查看。

1. 前后台间切换

可以通过bg (background)和fg(foreground)命令将其在前后台间状态切换。

2. 守护进程

如果一个进程永远都是以后台方式启动,并且不能受到Shell退出影响而退出,一个正统的做法是将其创建为守护进程。守护进程值得是系统长期运行的后台进程,类似Windows服务。守护进程信息通过ps –a无法查看到,需要用到–x参数,当使用这条命令的时候,往往还附上-j参数以查看作业控制信息,其中TPGID一栏为-1就是守护进程。

[root@xiexianbin_cn xin]# ps xj
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
    0     1     1     1 ?           -1 Ss       0   0:00 /sbin/init
    0     2     0     0 ?           -1 S        0   0:00 [kthreadd]
    2     3     0     0 ?           -1 S        0   0:00 [ksoftirqd/0]
    2     5     0     0 ?           -1 S<       0   0:00 [kworker/0:0H]
    2     6     0     0 ?           -1 S        0   0:01 [kworker/u30:0]
    2     7     0     0 ?           -1 S        0   0:00 [migration/0]
    2     8     0     0 ?           -1 S        0   0:00 [rcu_bh]
    2     9     0     0 ?           -1 S        0   0:00 [rcuob/0]
    2    10     0     0 ?           -1 S        0   0:00 [rcuob/1]
    2    11     0     0 ?           -1 S        0   0:00 [rcuob/2]
    2    12     0     0 ?           -1 S        0   0:00 [rcuob/3]
    2    13     0     0 ?           -1 S        0   0:00 [rcuob/4]
    2    14     0     0 ?           -1 S        0   0:00 [rcuob/5]
    2    15     0     0 ?           -1 S        0   0:00 [rcuob/6]
    2    16     0     0 ?           -1 S        0   0:00 [rcuob/7]
    2    17     0     0 ?           -1 S        0   0:00 [rcuob/8]
    2    18     0     0 ?           -1 S        0   0:00 [rcuob/9]

创建守护进程最关键的一步是调用setsid函数创建一个新的Session,并成为Session Leader。成功调用该函数的结果是:

  • 创建一个新的Session,当前进程成为Session Leader,当前进程的id就是Session的id

  • 创建一个新的进程组,当前进程成为进程组的Leader,当前进程的id就是进程组的id

  • 如果当前进程原本有一个控制终端,则它失去这个控制终端,成为一个没有控制终端的进程。

&& 用法

shell 在执行某个命令的时候,会返回一个返回值,该返回值保存在 shell 变量 $? 中。当 $? == 0 时,表示执行成功;当 $? == 1 时(我认为是非0的数,返回值在0-255间),表示执行失败。

有时候,下一条命令依赖前一条命令是否执行成功。如:在成功地执行一条命令之后再执行另一条命令,或者在一条命令执行失败后再执行另一条命令等。shell 提供了 && 和 || 来实现命令执行控制的功能,shell 将根据 && 或 || 前面命令的返回值来控制其后面命令的执行。

语法格式如下:

command1 && command2 [&& command3 ...] 
  • 命令之间使用 && 连接,实现 逻辑与的功能。

  • 只有在 && 左边的命令返回真(命令返回值 $? == 0),&& 右边的命令才会被执行。

  • 只要有一个命令返回假(命令返回值 $? == 1),后面的命令就不会被执行。 –短路的功能

|| 用法

command1 || command2 [|| command3 ...]
  • 命令之间使用 || 连接,实现 逻辑或的功能。

  • 只有在 || 左边的命令返回假(命令返回值 $? == 1),|| 右边的命令才会被执行。这和 c 语言中的逻辑或语法功能相同,即实现短路逻辑或操作。

  • 只要有一个命令返回真(命令返回值 $? == 0),后面的命令就不会被执行。 –直到返回真的地方停止执行。

最新评论
加载中...