
システム:Linux Mint 19.1 Cinnamon 64ビット、Ubuntu 18.04 LTSベース。
次の情報を入手できるかどうか疑問に思います。
はいこの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- 書きました。
答え1
独自のソリューション
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"
。指摘したとおりマーク・プロニック、
mount
それ自体はそうではないかもしれませんPOSIX-define、言い換えれば参照は便利ですが、/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
その他の質問はコメントとして残してください。
答え2
findmntが利用可能な場合は、次のことを試すことができます。
test "$(findmnt -S UUID=$UUID)" || echo $UUID not mounted