#!/bin/sh tmp="$(mktemp)" test "$(id -u)" != "0" && sudo="sudo" logn () { >&2 printf "%s\n" "$@"; } log () { >&2 printf '%s' "$@"; } # Read one character read_char () { log ">" old_stty_cfg=$(stty -g) stty raw dd ibs=1 count=1 2> /dev/null stty "$old_stty_cfg" logn "" } get_dev () { grep "^$1\." "$tmp" | cut -f 2- -d ' '; } # mount the device with $1 as the choice mount () { dev="$(get_dev "$1")" test -z "$dev" && exit 1 logn "Mounting /dev/$dev on /media/$dev" mkdir -p /media/"$dev" $sudo mount /dev/"$dev" /media/"$dev" > /dev/null 2>&1 || return 1 } # umount the device with $1 as the choice umount () { mountpoint="$(sed -n "${1}p" "$tmp" | awk '{print $3}')" test -z "$mountpoint" && exit 1 logn "Unmounting $mountpoint" $sudo umount "$mountpoint" || return 1 } ejekt () { dev="$(get_dev "$1" | sed 's/.$//')" test -z "$dev" && exit 1 logn "Ejecting /dev/$dev" $sudo eject /dev/"$dev" > /dev/null 2>&1 || return 1 } # print lsblk, use $1 to print only devices with mountpoints or without pr_lsblk () { clear lsblk -o name,size,type,mountpoint logn "───────────────────────────────────" lsblk --ascii -o name,mountpoint | grep '^.-' | while read -r line do words="$(printf "%s" "$line" | wc -w)" test "$words" -eq "${1:-1}" && continue printf "%s\n" "$line" done | cut -f 2- -d "-" | awk '{print NR ". " $0}' | tee "$tmp" >&2 } cleanup () { rm -f "$tmp"; } trap cleanup EXIT INT logn "m(ount) u(mount) (e)ject ?" choice="$(read_char)" case $choice in "m") i=2; cmd=mount ;; "u") i=1; cmd=umount ;; "e") i=2; cmd=ejekt ;; *) exit 1 ;; esac pr_lsblk "$i" choice="$(read_char)" printf "%s" "$choice" | grep -q "[0-9]" || exit 1 if $cmd "$choice" then logn "Successful." else logn "Failed." fi