如何在新的分离Screen中运行Bash脚本内定义的函数?
在单个Bash脚本中通过分离Screen运行带参函数的方案
我在解决问题时找到了这个方案,觉得可能对其他人(包括以后的自己)有用,特意分享出来。
背景
如果要在多个自动关闭的分离Screen会话中并行执行单个命令,下面的写法很实用:
timeslots='00_XX 01_XX 02_XX 03_XX 04_XX 05_XX 06_XX' for timeslot in $timeslots; do screen -dmS $timeslot bash -c "echo '$timeslot' >> DUMP"; done
但如果每个timeslot需要在Screen里依次执行多个高负载命令(比如占用大量内存的任务,不宜并行),我们可以在脚本里写一个带参数的函数来封装这些串行命令:
test_function () { # 按顺序执行的命令示例 echo $1 >> DUMP; # 实际场景替换为高负载命令 echo $1 $1 >> DUMP; # 更多串行命令可继续添加 # ...其他命令 }
核心需求:如何创建分离Screen会话来运行这个函数,并且传入$timeslot参数?要求所有内容都在同一个Bash脚本里,不生成额外文件。
解决方案
关键是通过declare -f导出函数定义,让新启动的Bash进程能识别该函数,再结合bash -c完成带参调用。修改后的循环代码如下:
timeslots='00_XX 01_XX 02_XX 03_XX 04_XX 05_XX 06_XX' for timeslot in $timeslots; do screen -dmS "$timeslot" bash -c "$(declare -f test_function); test_function '$timeslot'" done
原理说明
declare -f test_function会输出test_function的完整代码定义- 将函数定义与调用命令用分号拼接,作为
bash -c的执行参数,这样新启动的Bash进程会先加载函数,再执行带参数的调用 - 全程无需额外创建脚本文件,所有逻辑都保留在原脚本内,保持简洁
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

