我正在编写一个实用程序,该程序需要运行mkfs
来格式化块设备。
我使用go的exec
包为每种文件系统类型运行正确的mkfs
命令,例如ext2:
err := exec.CommandContext(ctx, "mkfs.ext2", "-F", path).Run()
不幸的是,如果块设备已被格式化mkfs
,则会要求确认(并挂起)。这意味着我不得不通过危险的-F
标志来跳过此检查,如果设备已经格式化,则会丢失数据。
我无法在上下文中添加超时,因为除此确认外,格式化可能会花费一些时间。
我找不到mkfs
标志,该标志使它返回错误,而不是确认是否已格式化块设备。
我宁愿不依靠解析mkfs
命令的输出来查看它是否要求确认检查,因为如果mkfs
输出更改,它将使它中断。
如果已格式化块设备而不是挂在此确认检查上,是否可以通过正确的错误消息中止命令?
答案 0 :(得分:0)
事实证明,如果我们在不带终端(tty)的情况下运行命令,那么将假定-F
选项,并且将格式化设备,而不考虑目标设备是否已经具有文件系统。
这与mkfs.ext2
,mkfs.ext3
和mkfs.ext4
一起发生
这实际上是遗留行为,如here
所示 mkfs.xfs
和mkfs.btrfs
的行为正确,并且如果块设备是
已经格式化。
我将其发布为答案,因为我认为这意味着没有实际的解决方案……如果设备上已有数据,则在终端外部运行mkfs.ext2
总是会删除数据。