Aqui está um script python que reunirá todas as partições USB montadas e executará udisksctl unmount -b <DEV>
em cada uma delas. As regras padrão para tornar isso um atalho de trabalho se aplicam: certifique-se de que o script seja executável e forneça o caminho completo para o script como comando.
Conforme solicitado, apenas os erros serão exibidos na caixa de diálogo da GUI, outra saída não será mostrada.
#!/usr/bin/env python
import os
import subprocess
import sys
def run_cmd(cmdlist):
""" utility: reusable function for running external commands """
try:
stdout = subprocess.check_output(cmdlist,stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as cpe:
# GtkDialog error should be ignored.
if not "GtkDialog mapped without a transient parent" in cpe.output:
return error_dialog(cpe.output," ".join(cmdlist))
def error_dialog(err_msg,called_cmd):
""" Displays graphical error dialog and exits the script"""
subprocess.call(['zenity','--error','--text',err_msg,'--title',called_cmd])
sys.exit(1)
def find_usb_partitions():
""" Constructs a list of USB partitions """
return tuple( os.path.realpath(os.path.join("/dev/disk/by-path",p))
for p in os.listdir("/dev/disk/by-path")
if 'usb' in p and 'part' in p
)
def find_mounted_devs():
devs=[]
with open('/proc/mounts') as mounts:
for line in mounts:
dev = line.split()[0]
if dev.startswith('/dev/'):
devs.append(dev)
return devs
def main():
parts=find_usb_partitions()
devs=find_mounted_devs()
mounted_parts=tuple(i for i in parts if i in devs)
for part in mounted_parts:
run_cmd(['udisksctl', 'unmount', '-b',part])
run_cmd(['udisksctl', 'power-off', '-b',part])
if __name__ == '__main__': main()
Pensamentos adicionais
Enquanto o script funciona, acho a ideia de desmontar do atalho um pouco redundante. Tal tarefa requer pelo menos algum envolvimento de um usuário. Se o objetivo é ser capaz de desmontar sem terminal, já existem maneiras de fazer isso. Por exemplo, se você é um usuário do Unity, você já tem o ícone do dispositivo no lançador, do qual você pode clicar com o botão direito e ejetar o dispositivo. Eu escrevi Udisks-Indicator , que você pode usar para desmontar partições de um indicador gráfico (e que usa algumas das mesmas idéias que usei nesta resposta). Em ambos os casos, já existem alternativas, mas eu pessoalmente aconselharia o uso de atalhos para desmontar as coisas. Mas, novamente, esta é apenas minha opinião pessoal.