shell 等待后台作业完成后再继续

pnwntuvh  于 2023-04-21  发布在  Shell
关注(0)|答案(1)|浏览(190)

我想编译包含在目录层次结构中的文件。像这样:tree src

src
├── dir0
│   ├── subdir1
│   │   ├── srcfile0.lang
│   │   ├── srcfile1.lang
│   │   └── srcfile2.lang
│   ├── subdir3
│   │   ├── srcfile0.lang
│   │   ├── srcfile1.lang
│   │   ├── srcfile2.lang
│   │   └── subsubdir10
│   │       ├── srcfile100.lang
│   │       └── srcfile102.lang
│   └── subdir4
│       ├── srcfile0.lang
│       ├── srcfile1.lang
│       ├── srcfile2.lang
│       └── subsubdir11
│           ├── srcfile101.lang
│           └── srcfile102.lang
├── dir1
│   ├── subdir1
│   │   ├── srcfile0.lang
│   │   ├── srcfile1.lang
│   │   └── srcfile2.lang
│   ├── subdir3
│   │   ├── srcfile0.lang
│   │   ├── srcfile1.lang
│   │   ├── srcfile2.lang
│   │   └── subsubdir11
│   │       ├── srcfile100.lang
│   │       └── srcfile101.lang
│   └── subdir4
│       ├── srcfile0.lang
│       ├── srcfile1.lang
│       ├── srcfile2.lang
│       └── subsubdir10
│           ├── srcfile100.lang
│           └── srcfile102.lang
├── dir2
│   ├── subdir0
│   │   ├── srcfile0.lang
│   │   └── srcfile2.lang
│   └── subdir3
│       ├── srcfile0.lang
│       └── srcfile1.lang
├── srcfile06.lang
├── srcfile07.lang
└── srcfile08.lang

16 directories, 33 files

每个文件都独立于其他文件。我想在另一个名为“build”的目录中编译这个层次结构,如下所示:tree build

build
├── dir0
│   ├── subdir1
│   │   ├── srcfile0.lang.out
│   │   ├── srcfile1.lang.out
│   │   └── srcfile2.lang.out
│   ├── subdir3
│   │   ├── srcfile0.lang.out
│   │   ├── srcfile1.lang.out
│   │   ├── srcfile2.lang.out
│   │   └── subsubdir10
│   │       ├── srcfile100.lang.out
│   │       └── srcfile102.lang.out
│   └── subdir4
│       ├── srcfile0.lang.out
│       ├── srcfile1.lang.out
│       ├── srcfile2.lang.out
│       └── subsubdir11
│           ├── srcfile101.lang.out
│           └── srcfile102.lang.out
├── dir1
│   ├── subdir1
│   │   ├── srcfile0.lang.out
│   │   ├── srcfile1.lang.out
│   │   └── srcfile2.lang.out
│   ├── subdir3
│   │   ├── srcfile0.lang.out
│   │   ├── srcfile1.lang.out
│   │   ├── srcfile2.lang.out
│   │   └── subsubdir11
│   │       ├── srcfile100.lang.out
│   │       └── srcfile101.lang.out
│   └── subdir4
│       ├── srcfile0.lang.out
│       ├── srcfile1.lang.out
│       ├── srcfile2.lang.out
│       └── subsubdir10
│           ├── srcfile100.lang.out
│           └── srcfile102.lang.out
├── dir2
│   ├── subdir0
│   │   ├── srcfile0.lang.out
│   │   └── srcfile2.lang.out
│   └── subdir3
│       ├── srcfile0.lang.out
│       └── srcfile1.lang.out
├── srcfile06.lang.out
├── srcfile07.lang.out
└── srcfile08.lang.out

16 directories, 33 files

当我有了第一个层次结构时,我希望有最后一个层次结构,其中所有可编译文件都编译并存储在“构建”层次结构中。
我写了这个剧本来做这件事。
cat mycompiler

#!/usr/bin/env sh

CURRENTDIR="$(dirname -- \""$(readlink -f \""${O}\"")\"")"
SRCDIR="${1:-$CURRENTDIR}"
BUILDDIR="$(dirname \""${SRCDIR}\"")/build"

# compile build hierarchy
COMPILER="cat"
OPTION=""
INPUTEXT=".lang"
OUTPUTSUCCESSEXT=".out"
OUTPUTFAILUREEXT=".log"

compile () {
  f="${1}"
  dir=$(dirname -- "${f}" | sed "s#${SRCDIR}#${BUILDDIR}#")
  mkdir -p "${dir}"
  success=$(echo "${f}" | sed "s#${SRCDIR}#${BUILDDIR}#;s#\(${INPUTEXT}\)#\1${OUTPUTSUCCESSEXT}#")
  failure=$(echo "${f}" | sed "s#${SRCDIR}#${BUILDDIR}#;s#\(${INPUTEXT}\)#\1${OUTPUTFAILUREEXT}#")
  #echo "${COMPILER} ${f} >${success} 2>${failure}"
  "${COMPILER}" "${OPTION}" "${f}" >"${success}" 2>"${failure}"
}

find "${SRCDIR}" -type f -iname "*${INPUTEXT}" | while IFS= read -r f
do
  compile "${f}" &
done

find "${BUILDDIR}" -type f -iname "*${OUTPUTFAILUREEXT}" -empty -exec rm {} \;

exit 0

由于文件是独立的,我希望它并行发生,以加快进程,但只在while循环中。
脚本的最后两个命令(见下文)需要等待所有后台任务完成。

find "${BUILDDIR}" -type f -iname "*${OUTPUTFAILUREEXT}" -empty -exec rm {} \;

exit 0

有谁能帮我改进我的剧本吗?
谢谢!

kadbb459

kadbb4591#

使用wait等待所有后台作业完成的通常方法被函数compile()隐藏。
这会使代码变得很难看,但是如果将compile()的内容拉入主脚本,执行wait就可以了。
和:shbash的某些版本要求使用set -m显式打开作业控制

相关问题