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

问题描述 投票:0回答:1

我的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

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

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

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

非常感谢!!

bash ubuntu makefile gnu-make
1个回答
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

我不知道这是否足以强迫它。

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

© www.soinside.com 2019 - 2024. All rights reserved.