我对 unix 脚本的执行模式有疑问。
例如包含以下行的脚本:
command B
function C()
{
Myscript // Myscript is a script
command D
}
command E
假设如果Myscript
执行时间较长(例如 5 分钟),则下一个命令 ( command D
) 将执行或等待Myscript
完成。
答案1
对于您的特定脚本,两者Myscript
都command D
不会被执行。您已经定义了一个函数C
,但没有调用它。
执行顺序是:
command B
运行至完成。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
在后台运行。然后,脚本等待A
和B
完成后退出。
答案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 的答案包含了一个很好的观点:你不调用该函数,所以它永远不会运行。