Linux Bash脚本没有';不要等到命令被正确执行

Linux Bash脚本没有';不要等到命令被正确执行,linux,bash,shell,udev,Linux,Bash,Shell,Udev,我正在编写一个非常简单的脚本,但由于某些原因,部分脚本似乎是异步运行的 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-mis

我正在编写一个非常简单的脚本,但由于某些原因,部分脚本似乎是异步运行的

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

正如您在调用sleep之前看到的,脚本只完成了部分工作。如何使脚本等待parted成功完成其工作?

假设您只想确保在继续之前创建分区,有两种不同的方法

  • 在进入下一步之前,请检查流程parted是否已完成

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

  • (由于您问题中的链接,我假设您正在Linux上工作)

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

    • parted
      创建一个分区
    • 内核更新其内部状态
    • 内核通知
      udev
      守护进程(
      udevd
    • udevd
      检查其规则文件(通常在
      /etc/udev/
      下),并创建适当的设备节点
    此过程允许将设备节点处理策略与内核明确分离,这是一件好事(TM)。不幸的是,它还带来了相对不可预测的延迟

    处理此问题的一种可能方法是让脚本等待设备节点出现:

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