我有这一行:
trap 'jobs -p | xargs kill -9' SIGINT SIGTERM EXIT
它在我拥有的许多 bash shell 脚本中重复出现。
共享此代码的最佳方式是什么?我可以调用 bash 函数吗?
实际上,我正在创建一个框架,并且用户将需要编写一些粘合 shell 脚本。如果用户的 shell 脚本能够以某种方式从基本 shell 脚本继承,那就太好了。或者他们可以以某种方式调用预先存在的 bash 函数。
这问题如果我创建一个像这样的 bash 函数:
// a.sh
function trap_and_kill_child_jobs {
trap 'jobs -p | xargs kill -9' SIGINT SIGTERM EXIT
}
并从另一个脚本中调用它,如下所示:
// b.sh
source ./a.sh
trap_and_kill_child_jobs
sh -c 'sleep 10000 &' & # I want this process to be killed by `trap_and_kill_child_jobs`
./run-some-tests.js
调用者脚本 ( b.sh
) 执行以下操作不是实际经历陷阱。 b.sh 创建的“子作业”将继续运行。
答案1
创建一个包含框架函数的脚本文件就足够了,如下所示:
/tmp/framework.sh
# Define a serie of functions of your framework...
function framework_function_1() {
echo "function 1 executed"
}
function framework_function_2() {
echo "function 2 executed"
}
# And put here anything you want to be executed right away (like the trap)
echo "framework.sh was executed"
然后将其包含在其余脚本中,如下所示:
/tmp/b.sh
# Include the framework:
. /tmp/framework.sh
echo "Script b.sh was executed"
# Calling a framework's function
framework_function_2
这样,b.sh(以及包括framework.sh在内的任何其他脚本)的执行将如下所示:
$ /tmp/b.sh
framework.sh was executed
Script b.sh was executed
function 2 executed
请注意,. /tmp/framework.sh
与 相同source /tmp/framework.sh
。