系统:基于Ubuntu 18.04 LTS的Linux Mint 19.1 Cinnamon 64位。
我想知道是否有可能获得以下信息:
是否已安装(块设备的)UUID?(不知道安装点)
尽管如此,我已经玩了半天,但我无法弄清楚。
我至少创建了一些工作代码,在这些代码下,这两个USB硬盘驱动器均会卸装并关闭电源。
我的代码的当前临时版本如下所示:
dismount_and_poweroff_external_drives()
{
name_external_drive_500gb_ntfs='500GB NTFS USB 2.0 HDD'
name_external_drive_2_0tb_ext4='2.0TB Ext4 USB 3.0 HDD'
uuid_external_drive_500gb_ntfs='xxxxxxxxxxxxxxxx' # censored
uuid_external_drive_2_0tb_ext4='xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' # censored
path_external_drive_500gb_ntfs="/dev/disk/by-uuid/${uuid_external_drive_500gb_ntfs}"
path_external_drive_2_0tb_ext4="/dev/disk/by-uuid/${uuid_external_drive_2_0tb_ext4}"
tput bold; tput setaf 3; printf '%b' "\\n${name_external_drive_500gb_ntfs} un-mount\\n"; tput sgr0
# info test ‘-b FILE’: True if FILE exists and is a block special device.
if [ ! -b "${path_external_drive_500gb_ntfs}" ]
then
tput bold; tput setaf 4; printf '%b' "The device is not plugged in or powered on.\\n"; tput sgr0
else
if umount "${path_external_drive_500gb_ntfs}"
then
tput bold; tput setaf 2; printf '%b' "Un-mounting OK.\\n"; tput sgr0
if udisksctl power-off --block-device "${path_external_drive_500gb_ntfs}"
then
tput bold; tput setaf 2; printf '%b' "Powering-off OK.\\n"; tput sgr0
else
tput bold; tput setaf 1; printf '%b' "Powering-off Failed.\\n"; tput sgr0
fi
else
tput bold; tput setaf 1; printf '%b' "Un-mounting Failed.\\n"; tput sgr0
fi
fi
printf '\n'
tput bold; tput setaf 3; printf '%b' "\\n${name_external_drive_2_0tb_ext4} un-mount\\n"; tput sgr0
# info test ‘-b FILE’: True if FILE exists and is a block special device.
if [ ! -b "${path_external_drive_2_0tb_ext4}" ]
then
tput bold; tput setaf 4; printf '%b' "The device is not plugged in or powered on.\\n"; tput sgr0
else
if umount "${path_external_drive_2_0tb_ext4}"
then
tput bold; tput setaf 2; printf '%b' "Un-mounting OK.\\n"; tput sgr0
if udisksctl power-off --block-device "${path_external_drive_2_0tb_ext4}"
then
tput bold; tput setaf 2; printf '%b' "Powering-off OK.\\n"; tput sgr0
else
tput bold; tput setaf 1; printf '%b' "Powering-off Failed.\\n"; tput sgr0
fi
else
tput bold; tput setaf 1; printf '%b' "Un-mounting Failed.\\n"; tput sgr0
fi
fi
printf '\n'
}
我忘记强调必须接受POSIX编写的解决方案。
UUID=<device_uuid>
mount | egrep $(readlink -f /dev/disk/by-uuid/${UUID}) && echo mounted
在帮助中使用-e
代替可能是一个好主意:-f
readlink
-e, --canonicalize-existing canonicalize by following every symlink in every component of the given name recursively, all components must exist
相比于:
-f, --canonicalize canonicalize by following every symlink in every component of the given name recursively; all but the last component must exist
据我了解,可以-e
保证整个路径都存在,可能会更好,需要额外的验证或引用。不幸的是,该-e
选项不符合POSIX标准,所以很幸运。将所有信息保留在此处以供将来参考。
原始解决方案中没有双引号,我建议将它们与一个尾随空格一起添加作为一种安全措施,以避免例如与之sda11
类似的匹配。
也可以利用POSIX定义的属性fgrep
来匹配固定的字符串,甚至可以更好地匹配使用开头的从此设备开始的行grep "^dev_name"
。
正如Mark Plotnick所指出的那样,mount
它本身可能不是POSIX定义的,再次引用将很方便,但是无论如何,我已经将代码更改为/proc/mounts
直接读取。
用于检查是否已安装UUID的结果函数可能类似于:
is_uuid_mounted()
{
readlink_output=$( readlink -f /dev/disk/by-uuid/"${1}" )
[ -n "${readlink_output}" ] &&
grep -F "${readlink_output} " /proc/mounts > /dev/null 2>&1
}
#!/bin/sh
set -eu
translate_uuid_to_device_name()
{
# Linux-specific; needs *BSD revision
readlink -f -n /dev/disk/by-uuid/"${1}"
}
is_uuid_mounted()
{
device_name=$( translate_uuid_to_device_name "${1}" )
if [ -n "${device_name}" ]
then
# 1. basic regex should be working across platfotms
# tested on FreeBSD, OpenBSD, NetBSD with success
# I prefer the starting with (^) rather than filtering throung all text
# 2. /proc/mounts is not available on all *BSDs, needs revision
proc_mounts=$( grep "^${device_name} " /proc/mounts )
[ -n "${proc_mounts}" ]
fi
}
# Simplest Usage Example
if is_uuid_mounted "PUT_SOME_UUID_IN_HERE"
then
echo "This UUID is mounted."
else
echo "This UUID isn't mounted."
fi
请随时在评论中解决其他问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句