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

时间:2019-02-13 08:34:43

标签: bash ubuntu makefile gnu-make

我的makefile:

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

但是,结果显示“目标繁忙”错误

$ 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

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

因此,我想问一下是否有办法等待上一个命令完成然后执行下一个命令

顺便说一句,我的平台是Ubuntu 18.4

非常感谢!

1 个答案:

答案 0 :(得分:3)

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

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

顺便说一句,在制作文件或任何其他非交互式环境中使用sudo -n时,通常最好使用sudo