Estou escrevendo um script simples onde preciso abrir um diretório dirname
com o Thunar e excluir esse diretório após fechar a janela do Thunar. Eu estava esperando algo como
thunar $dirname && rm -r $dirname
trabalhar.
O problema é que o thunar
processo parece não permanecer conectado ao terminal após a inicialização: após a execução thunar $dirname
, o shell vai diretamente para o próximo comando, em vez de esperar que a thunar
janela seja fechada. Como posso contornar isso?
Responder1
Já existe um processo Thunar em execução com a opção "--daemon" para que qualquer nova invocação do Thunar use esta e sua tentativa de iniciar um novo processo Thunar falhe e rm seja executado imediatamente. Observe que o próprio "Thunar --daemon" faznãoabra uma janela do Thunar.
O processo daemon geralmente é iniciado no login por definição em /etc/xdg/xfce4/xfconf/xfce-perchannel-xml/xfce4-session.xml ("/etc", não "~"). A remoção do sinalizador "--daemon" afetará os scripts existentes que não esperam que o Thunar seja fechado e bloqueará sua linha de comando se você iniciar o Thunar a partir daí.
Você pode "matar" o daemon Thunar antes da linha de script relevante com Thunar -q
, executar a linha e reiniciar o daemon Thunar --daemon &
depois dela - esteja ciente de &
no final para iniciar o daemon em segundo plano, caso contrário, seu script aguardará que ele termine ).Embargo:todas as janelas do Thunar que estavam abertas "no" daemon Thunar que você "matou" desaparecerão sem aviso prévio.
Então sua linha completa pode ser
Thunar -q && thunar $dirname && rm -r $dirname && Thunar --daemon &
Você pode dar uma olhadaPágina de manual do Thunar
Responder2
Quando já existe um processo Thunar em execução (gerenciador de desktop ou outra janela), uma nova janela Thunar será separada do processo de chamada e o próximo comando será iniciado, e não há pid
para uma janela específica. Isso está bem descrito na resposta de hh skladby.
Quero resolver o problema sem desligar o processo Thunar já iniciado.
Parece difícil usar pid
[sozinho], mas existe um wid
(ID da janela), que pode ser encontrado via wmctrl -lp
(em combinação com alguma lógica inteligente). Deixe o shellscript verificar isso (repetidamente em um loop) e quando ele wid
acabar, você poderá remover o diretório.
O shellscript a seguir mostra como isso pode ser feito. É apenas um script de demonstração, pois não há outra ação senão resolver o problema especificado na pergunta.
#!/bin/bash
if [ "$1" == "" ]
then
echo "No directory on command line"
dirname="MyDir"
else
dirname="$1"
fi
mkdir -p "$dirname"
if [ $? -ne 0 ]
then
echo "Bad directory name, try again"
exit 1
fi
thunar "$dirname"
pid=$(ps -e | grep -i thunar | sed -e 's/ *//' -e 's/ .*//')
#echo "$pid"
sleep 1
wid=$(wmctrl -lp | grep " $pid " | grep "${dirname##*/}" | tail -n1)
wid=$(echo "$wid" | tee /dev/stderr | sed 's/ .*//')
#echo "$wid"
echo "Waiting for you to close the Thunar window '${dirname##*/}' ..."
while wmctrl -lp | grep "$wid" > /dev/null
do
sleep 1
done
rm -r "$dirname"
echo "Done :-)"