システム:Linux Mint 19.1 Cinnamon 64ビット、Ubuntu 18.04LTSに基づく。
次の情報を入手できるかどうか知りたいのですが。
この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 [〜#〜] -ly書かれている必要があることを強調するのを忘れました。
UUID=<device_uuid>
mount | egrep $(readlink -f /dev/disk/by-uuid/${UUID}) && echo mounted
readlink
ヘルプから-e
の代わりに-f
を使用することをお勧めします。
-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 [〜#〜] に準拠していないことが判明したため、運が悪かった。今後の参考のためにすべての情報をここに残します。
元のソリューション には二重引用符はありません。セキュリティ対策として1つの末尾のスペースと一緒に追加することをお勧めします一致を避けるために例えばsda11
または同様。
[〜#〜] posix [〜#〜] -definedfgrep
を利用して一致させることもできます固定文字列の場合、またはgrep "^dev_name"
を使用してこのデバイスで始まる行のみに一致させることをお勧めします。
Mark Plotnick によって指摘されているように、mount
自体は [〜#〜] posix [〜#〜] -定義されていない可能性があります。引用は便利ですが、とにかくコードを/proc/mounts
から直接読み取るように変更しました。
UUIDがマウントされているかどうかをチェックするための結果の関数couldは次のようになります。
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
コメントでさらに問題に対処してください。
Findmntが利用可能な場合は、次を試すことができます。
test "$(findmnt -S UUID=$UUID)" || echo $UUID not mounted