脚本/程序如何在 unix 中执行?

脚本/程序如何在 unix 中执行?

我对 unix 脚本的执行模式有疑问。

例如包含以下行的脚本:

command B
function C()
{
Myscript   // Myscript is a script 
command  D
}
command E

假设如果Myscript执行时间较长(例如 5 分钟),则下一个命令 ( command D) 将执行或等待Myscript完成。

答案1

对于您的特定脚本,两者Myscriptcommand D不会被执行。您已经定义了一个函数C,但没有调用它。

执行顺序是:

  1. command B运行至完成。
  2. command E运行至完成。

如果您要调用C,它将运行Myscript到完成,然后运行command D到完成。

您在 shell 脚本中调用的所有内容都按照其出现的顺序运行,并运行直至完成。如果您需要与其他东西并行运行某些东西,您应该使用作业控制(查看如何&使用 & 字符将作业置于后台)。一个简单的例子:

A
B

运行A直到完成,然后运行B直到完成。脚本完成。

A &
B

在后台运行A,然后在前台运行 B。 shell 脚本在B完成后结束。A可能仍在运行。

A &
B &

A在后台运行,然后(无需等待A完成)B在后台运行。剧本立即结束。

A &
B &
wait

A在后台运行,然后(无需等待A完成)B在后台运行。然后,脚本等待AB完成后退出。

答案2

有一个例外,稍后将详细介绍,但这些命令是由同一个 shell 执行的(即使Myscript打开一个新 shell,它也command D将拥有运行它们的完全相同的“母”shell)。因为 *NIX shell 不支持并行化,所以Myscript必须停止其运行(使用任何退出代码)才能让控制通过command D

例外情况是您Myscript使用NOHUP信号或通过编写&后面的detach 来分离Myscript。这会将脚本置于后台。

研究以下代码片段:

openssl enc -e bf -in verybigfile -out outputfile -k thisismykey &; # this is a long operation because of the size of the very big file
echo 'hi!' # this will be written during the encrypting operation

我希望现在这几乎是不言自明的。


Alexios 的答案包含了一个很好的观点:你不调用该函数,所以它永远不会运行。

相关内容