Bash脚本不会等到命令正确执行完毕

我正在做一个非常简单的脚本,但由于某些原因,它似乎asynchronous运行。

singlePartDevice() { # http://www.linuxquestions.org/questions/linux-software-2/removing-all-partition-from-disk-690256/ # http://serverfault.com/questions/257356/mdadm-on-ubuntu-10-04-raid5-of-4-disks-one-disk-missing-after-reboot # Create single partition parted -s "$1" mklabel msdos # Find size of disk v_disk=$(parted -s "$1" print|awk '/^Disk/ {print $3}'|sed 's/[Mm][Bb]//') parted -s "$1" mkpart primary ext3 4096 ${v_disk} parted -s "$1" set 1 raid on return 0 } singlePartDevice "/dev/sdc" singlePartDevice "/dev/sdd" #/dev/sdc1 exists but /dev/sdd1 does not exist sleep 5s #/dev/sdc1 exists AND /dev/sdd1 does also exist 

正如你在睡眠之前所看到的,脚本只是部分完成了它的工作。 如何让我的脚本等到分手完成其工作?

(我假设你在Linux上工作,因为你的问题中的链接)

我不是很熟悉parted ,但我相信分区设备节点不是直接由它创建的 – 它们是由udev创建的,这本质上是一个异步过程:

  • parted创建一个分区
  • 内核更新其内部状态
  • 内核通知udev守护进程( udevd
  • udevd检查其规则文件(通常在/etc/udev/ )并创建适当的设备节点

该过程允许将设备节点处理策略与内核(Good Thing TM)清楚分离。 不幸的是,它也引入了相对难以预料的延迟。

处理这种情况的一种可能的方法是让您的脚本等待设备节点出现:

 while [ ! -e "/dev/sdd1" ]; do sleep 1; done 

假设你想要做的是确保分区在继续之前被创建,那么有几种不同的方法

  1. 在转移到下一步之前,检查是否已完成处理

  2. 在进入下一步之前检查设备是否准备就绪(您需要检查语法)。 例如直到[-f / dev / sdc && -f / dev / sdd] sleep 5