Primeiro, por que você não vê a saída? Como apontado por Sergiy Kolodyazhnyy nos comentários, os scripts iniciados pelo udev "não herdam as mesmas variáveis de ambiente, o que significa que eles não têm como saber onde e qual sessão da GUI você está executando." Em termos mais simples, o udev é ignorante quando se trata da GUI da área de trabalho.
Atualmente, faço algo semelhante ao que você pediu para dispositivos USB conectados ao meu sistema. Para um aplicativo que estou executando, preciso saber se o USB tem um número de série válido. De qualquer forma, aqui está como eu fiz isso acontecer.
Visão geral:
- Eu inicio um script auxiliar que cria um pipe nomeado e observa esse pipe nomeado para "mensagens" que trafegam nele.
- Eu configurei o udev para "enviar mensagens" (linhas de gravação) para o meu pipe nomeado (no meu caso, informações de sn do USB e de partição).
- Meu script auxiliar vê cada linha de texto entrar e eu uso o comando notify-send para despejar a mensagem na minha tela na forma de uma notificação.
Se você quiser vê-lo apenas em uma janela de terminal, poderá informar ao seu script de ajuda para simplesmente fazer eco do texto do canal nomeado na janela do terminal.
Código de amostra:
#!/bin/bash
#This script should be called once without an argument to get it running in a "service" mode
#Successive calls to this script by UDEV sould pass a string as the first argument.
# These strings will then be displayed in the window running in service mode.
pipe=/tmp/messages
if [ "" == "" ]; then
[ ! -e "$pipe" ] && mkfifo "$pipe"
while true # this loop continuously reads new lines and echos them
do
line=$(cat "$pipe")
echo "$line"
done
fi
# you won't reach this line unless you call this script with one argument
echo "" >> "$pipe"
Executando este script:
- Salve as opções acima em um arquivo
/tmp/sample_script.sh
(será excluído na reinicialização) - Torne o script executável
chmod +x /tmp/sample_script.sh
- Chame o script para executá-lo no modo de serviço (ou seja, sem nenhum argumento)
/tmp/sample_script.sh
- Em outra janela de terminal / script / udev, execute
/tmp/sample_script.sh "message to send"
(observe que estamos passando o argumento string, "message to send", here) - Volte para a janela de serviço e você verá que a string "message to send" apareceu na janela.
Ao executar o script do udev, você não poderá fazer com que a segunda instância exiba qualquer coisa na tela diretamente, sem redirecioná-la pelo canal nomeado, porque o script do udev é chamado a partir de um ambiente completamente separado do O pipe nomeado criado no script e utilizado em ambos os ambientes atua como uma ponte entre os dois, permitindo que você transmita informações do ambiente do udev para o ambiente da GUI que está visualizando.