shell脚本

shell脚本

  • 命令间隔符号
    • & :命令同时执行
    • && 顺序执行
    • | :管道符号
    • ||
  • nohup
    • wait命令
    • wait 后台进程的结束
    • 等待多子进程结束,并获得退出状态
    • wait并获取输出

命令间隔符号

&、&&、| 和 || 区别

& :命令同时执行

 command1 & command2 & command3     # 三个命令同时执行;
  • 用 & 连接的多个符号将同时执行,不管命令是否执行成功;
  • 三个脚本会同时开始运行,且拥有各自独立的 sub-shell 环境。在 shell 脚本中,这个方法常常被用来利用计算机的多核性能来加速执行。

注:一个 & 命令放在bash行尾:其作用是令该命令转到后台执行。对于这样的命令,系统会创建一个 sub-shell 来运行这个命令。同时,在执行改行命令的 shell 环境中,这个命令会立刻返回 0 并且继续下面的 shell 命令的执行。除此之外,在执行这个命令之后,terminal 上会输出创建的 sub-shell 的线程 ID(PID)。

通过&分支出去的 sub-shell 的 PID 被存储在一个特殊的变量$!中,

$ echo $!
77923

链接:https://www.jianshu.com/p/410cd35e642f

&& 顺序执行

command1 && command2    #只有前面命令执行成功,后面命令才继续执行

&& 左边的命令(命令 1)返回真(即返回 0,成功被执行)后,&& 右边的命令(命令 2)才能够被执行;换句话说,“如果这个命令执行成功 && 那么执行这个命令”

| :管道符号

管道符号,是 unix 一个很强大的功能,符号为一条竖线:“|”。

command 1 | command 2

他的功能是把第一个命令 command 1 执行的结果作为 command2 的输入传给 command 2

||

command1 || command2

|| 则与 && 相反。如果||左边的命令(command1)未执行成功,那么就执行||右边的命令(command2);或者换句话说,“如果这个命令执行失败了 || 那么就执行这个命令”。

如果不添加任何逻辑符号,脚本中的命令将会按照行的顺序进行执行,当第一行命令 comman1 执行完后,然后才会启动第二行执行命令 command2 。如果命令 command2 的执行需要用到 comman1的执行结果时,请采用这种方法。

例如:

command1
command2

————————————————
原文链接:https://blog.csdn.net/u012069313/article/details/124697566

nohup

在命令的末尾加个&符号后,程序可以在后台运行,但是一旦当前终端关闭(即退出当前帐户),该程序就会停止运行。想要退出当前终端,但又想让程序在后台运行,该如何处理:在这种情况下,我们就可以使用nohup命令。。

nohup 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。

nohup 命令,在默认情况下(非重定向时),会输出一个名叫 nohup.out 的文件到当前目录下(如果不将 nohup 命令的输出重定向),如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。
语法

 nohup Command [ Arg … ] [ & ]
 参数说明:
Command:要执行的命令。
Arg:一些参数,可以指定输出文件。
&:让命令在后台执行,终端退出后命令仍旧执行。

如果要停止运行,你需要使用以下命令查找到 nohup 运行脚本到 PID,然后使用 kill 命令来删除:

ps -aux | grep "runoob.sh" 
kill -9  进程号PID

nohup命令提交作业时,指定输出文件:

nohup command > myout.file 2>&1 &

2>&1解释:

  • 将标准错误(2)重定向到标准输出(&1),
  • 标准输出(&1)再被重定向输入到myout.file文件中。
0 – stdin (standard input,标准输入) 
1 – stdout (standard output,标准输出)
2 – stderr (standard error,标准错误输出) 

如:./startup.sh 2>&1 | tee startup.log

  • 表示将执行startup.sh脚本后到标准输出和标准错误输出内容写入到startup.log文件中。tee 默认是覆盖的方式写入文件中,加-a表示追加。
  • 最终解释:表示命令执行后退出交互命令行也不挂起,通过最后一个 &,表示后台运行,不霸占交互命令行,同时将标准输出和标准错误输出合并到myout.file文件中。

wait命令

bash wait 命令是一个 Shell 命令,它等待后台运行的进程完成并返回退出状态。与等待指定时间的sleep 命令不同,该wait命令等待所有或特定后台任务完成。

命令 解释
wait 如果没有任何参数,该wait命令会等待所有后台进程完成,然后再继续执行脚本。
wait pid 添加的 PID 或作业 ID 会等待特定进程结束,然后再继续执行脚本。
wait -n 仅等待以下后台进程完成并返回退出状态。
wait -f 终止程序首先等待后台任务完成后再退出。

wait [作业指示或进程号]

  • 1.等待指定作业号或者进程号的进程退出,返回最后一个作业或进程的退出状态状态。如果没有指定参数,则等待所有子进程的退出,其退出状态为0.
  • 2.如果是shell中等待使用wait,则不会等待调用函数中子任务。在函数中使用wait,则只等待函数中启动的后台子任务。
  • 3.在shell中使用wait命令,相当于高级语言里的多线程同步

语法
  wait(参数) 使用 wait 是在等待上一批或上一个脚本执行完(即上一个的进程终止),再执行wait之后的命令。

wait 后台进程的结束

cmd1 & cmd2 & wait
wait放最后,cmd1和cmd2后台同时运行,然后等待他们结束。

等待多子进程结束,并获得退出状态

shell脚本_第1张图片
or
shell脚本_第2张图片

wait并获取输出

(cmd1; echo "cmd1 output" >&3)& pid1=$!
(cmd2; echo "cmd2 output" >&3)& pid2=$!
(cmd3; echo "cmd3 output" >&3)& pid3=$!
wait $pid1 $pid2 $pid3
exec 3>&
cat <&3

这个命令也会让 command1、command2 和 command3 三个命令在后台同时运行,然后等待它们的结束。在每个子进程的命令后面,我们使用 echo 命令来输出它们的输出,并将它们重定向到文件描述符3。在 wait 命令后面,我们指定了三个进程号,表示要等待这三个进程的结束。最后,我们使用 cat 命令来读取文件描述符3的内容,并输出它们的输出

你可能感兴趣的:(bash,shell)