Subj. Скрипт при помощи dmenu отображает список съемных устройств в виде «точка монтирования (файл устройства)», пытается отмонтировать посредством udisks выбранное пользователем устройство и выдает через notify-send сообщение об успехе либо возвращенную udisks причину неуспеха. Сообщение автоматически исчезает через 10 секунд.
Как пользоваться: положить куда-нибудь в PATH (к примеру, ~/bin/umgui или /usr/local/bin/umgui) и назначить средствами WM/DE вызов на горячую клавишу.
Скрипт написан на shell (проверялось на bash, но, думаю, заработает на любом POSIX-совместимом shell), помимо udisks, dmenu и notify-send требует awk. Проверен на Russian Fedora Remix 14.
Собственно umgui:
#!/bin/sh
# vi:noet:ts=2:sw=2:ft=sh:sta:si:tw=80
# Assume a device to be user-unmountable if a corresponding line in mount(8)
# contains a $UM_MARKER substring
UM_MARKER="uhelper=udisks"
# A command to actually unmount the device. Currently only udisks(1) is
# supported
UM_UNMOUNT_CMD=udisks
UM_UNMOUNT_CMD_ARGS=--unmount
# A command to display the menu with. Must be compatible with dmenu(1) i. e.
# take menu items from STDIN and output a selection to STDOUT
UM_MENU_CMD=dmenu
# TODO: l18n (gettext?) for notifies
# Notify displayed after successful unmount, %s is for device file (e. .g
# /dev/sda1)
UM_NOTIFY_OK="Now device %s can be safely removed"
# Notify displayed if there is nothing to unmount
UM_NOTIFY_NORD="No removable devices found"
UM_NOTIFY_CMD=notify-send
UM_NOTIFY_ARGS="-t 10000"
UM_NOTIFY_ARGS_CRIT="$UM_NOTIFY_ARGS -u critical"
# Echoes $1 (optional) and exits with status $2 (optional)
_exit () {
[ $# -eq 0 ] && exit
[ $# -eq 1 ] && {
echo $1
exit
}
[ $# -eq 2 ] && {
echo $1 >&2
exit $2
}
}
# Graphically echoes $1 (optional) and exits with status $2 (optional)
_exit_gui () {
[ $# -eq 0 ] && exit
[ $# -eq 1 ] && {
"$UM_NOTIFY_CMD" $UM_NOTIFY_ARGS "$1"
exit
}
[ $# -eq 2 ] && {
"$UM_NOTIFY_CMD" $UM_NOTIFY_ARGS_CRIT "$1"
exit $2
}
}
for CMD in "$UM_UNMOUNT_CMD" "$UM_MENU_CMD" "$UM_NOTIFY_CMD" ; do
which "$CMD" > /dev/null 2>&1 || _exit "$CMD: command not found" 1
done
MOUNTPOINTS=$(mount | awk '/'"$UM_MARKER"'/ { print $3,"("$1")" }')
[ -z "$MOUNTPOINTS" ] && _exit_gui "$UM_NOTIFY_NORD" 2
DEVICE=$(echo "$MOUNTPOINTS" | "$UM_MENU_CMD" | awk '{ print $2 }' | tr -d ')(')
[ -z "$DEVICE" ] && _exit
# TODO: rewrite the code below when (and if) someone rewrites udisks to exit
# with non-zero status on error
UM_UNMOUNT_CMD_ARGS="$UM_UNMOUNT_CMD_ARGS $DEVICE"
UM_UMNOUNT_CMD_MSG=$("$UM_UNMOUNT_CMD" $UM_UNMOUNT_CMD_ARGS 2>&1)
[ -z "$UM_UMNOUNT_CMD_MSG" ] || _exit_gui "$UM_UMNOUNT_CMD_MSG" 3
_exit_gui "$(printf "$UM_NOTIFY_OK" "$DEVICE")"