GNU make:如何等待 "cp" 命令完成

GNU make: How to wait "cp" command to finish

我的生成文件:

make:
# Mount Loader.bin
    sudo mount -t vfat -o loop Boot.img mnt
    sudo cp Loader.bin mnt
    sudo umount mnt

但是,结果显示错误 "target busy"

$ make make
sudo mount -t vfat -o loop Boot.img mnt
[sudo] password for shore: 
sudo cp Loader.bin mnt
sudo umount mnt
umount: /home/shore/MineOS/mnt: target is busy.
makefile:7: recipe for target 'make' failed
make: *** [make] Error 32

它是随机发生的,我想主要的想法是在复制过程中执行卸载。

所以我想问一下有没有什么办法可以等到上一个命令执行完再执行下一个命令

对了,我的平台是Ubuntu18.4

非常感谢!!

make 一次只运行配方中的一行,它总是等待上一行完成,然后再 运行 下一行。它必须等待,因为如果当前行失败,配方必须在不开始下一行的情况下失败。

可能发生的情况是 cp 正在退出,但数据尚未完全刷新到挂载的文件系统:内核仍在写出缓冲数据。所以即使复制命令已经完成,分区仍然很忙。

也许你可以使用类似的东西强制它同步(这里我假设你使用的是 GNU/Linux 或兼容的东西):

make:
# Mount Loader.bin
        sudo mount -t vfat -o loop Boot.img mnt
        sudo cp Loader.bin mnt
        sudo sync -f mnt/Loader.bin
        sudo umount mnt

我不知道这是否足以强制执行。

顺便说一句,当您在 makefile 或任何其他非交互式环境中使用 sudo 时,使用 sudo -n 通常是个好主意。