我有一个像这样的脚本:
#!/bin/bash
if findmnt --source UUID=309689b5-ea5c-4175-84c7-192631553eab --source PARTLABEL=WDPurple8TB --mountpoint /media/ismail/WDPurple8TB --types ext4 --noheadings; then
udisksctl unmount -b /dev/disk/by-label/WDPurple8TB
udisksctl power-off -b /dev/disk/by-label/WDPurple8TB
echo "Power-Off /dev/disk/by-label/WDPurple8TB"
fi
if findmnt --source UUID=151cf7f0-461a-416f-8e44-63d799418958 --source PARTLABEL=WDPurple6TB --mountpoint /media/ismail/WDPurple6TB --types ext4 --noheadings; then
udisksctl unmount -b /dev/disk/by-label/WDPurple6TB
udisksctl power-off -b /dev/disk/by-label/WDPurple6TB
echo "Power-Off /dev/disk/by-label/WDPurple6TB"
fi
在这里,如果两个 if-fi 代码块并行运行会更好。但是,if-fi 代码块中的 stdout 和 stderr 应该成组出现(我的意思是它们的输出不应该重叠)。我的意思是:
在我们到达第一个if-fi 代码块的末尾后,应显示以下三行的标准输出和标准错误。
udisksctl unmount -b /dev/disk/by-label/WDPurple8TB
udisksctl power-off -b /dev/disk/by-label/WDPurple8TB
echo "Power-Off /dev/disk/by-label/WDPurple8TB"
在我们到达第二个if-fi 代码块的末尾后,应显示以下三行的标准输出和标准错误。
udisksctl unmount -b /dev/disk/by-label/WDPurple6TB
udisksctl power-off -b /dev/disk/by-label/WDPurple6TB
echo "Power-Off /dev/disk/by-label/WDPurple6TB"
我怎样才能做到这一点?
要序列化这些输出(和错误),您必须至少暂时保存其中一个:
这里使用 的
zsh
进程=(...)
替换形式来创建临时文件。使用 sh 或 bash,您可以使用mktemp
或系统上可用的任何命令来安全地创建临时文件。严格来说,说话
=(cmd)
并不意味着像那样使用,因为 zsh 会在扩展命令完成后立即删除临时文件。在这里,我们稍后使用相同的路径重新创建它,因此它不是严格安全的,因为有一个小窗口,在此期间文件可能已被恶意行为者重新创建为符号链接。对于任意数量的并行卸载,我们可以分解一些东西。我们还可以为那些要删除的临时文件打开 fds,以便从一开始就删除它们,解决上述问题并进行清理:
(未经测试)
这行得通吗:
或者: