Bash / xdotool: Comandos funcionam, mas não em um script

2

Eu estou fazendo um script bash para o Linux, que fecha a janela do terminal, se a janela perder o foco.

Na linha de comando, consegui fazer isso:

termwin=$(xdotool getactivewindow)

while : 
do 
  if [[ $(xdotool getactivewindow) != $termwin ]]
  then 
    exit 
  fi 
done

Funciona digitado manualmente em um terminal, mas, se eu colocá-lo em um script, em vez de fechar a janela quando o foco é perdido, o script simplesmente pára. Nenhum erro ou qualquer coisa, apenas de volta a um prompt.

Eu sinto que estou sentindo falta de algo básico.

EDITAR

Depois de ler isto ...: Veja aqui

Eu tentei executar isso como ". test.sh" em vez de "./test.sh" e funcionou. O link descreve a diferença nesses métodos como executar o script como um subprocesso ou como parte do processo principal, respectivamente. Alguém pode apenas explicar isso, e / ou modificar o script para ser executado com sucesso com "./" em vez de ".", No último cria problemas?

    
por Fruckubus Crunt 16.05.2012 / 17:57

2 respostas

1

Quando você origina o arquivo com . , os comandos serão executados como se você tivesse entrado neles na linha de comando. Assim, exit sairá do seu shell atualmente em execução.

Para sair do shell do qual o script foi executado ao bifurcar, você precisa obter o ID do processo pai. Você pode tentar executar

kill ${PPID}

no script em vez de exit para matar o shell pai (dica: tente apenas fazer o eco do pid primeiro e verificar em qual processo ele corresponde para que você não mate seu WM ou algo assim).

Se ${PPID} não fizer isso por você, você também pode tentar enviar o pid como um parâmetro para o script, mas isso depende de como e onde é chamado.

Você disse que usou urxtvd / urxvtc . Com essa combinação, esse script mata o terminal do qual foi iniciado:

#!/bin/sh
echo kill in 3
sleep 3
kill -1 ${PPID}

para que você possa usar kill -1 dessa maneira para matar uma única urxvtc instância.

Observe que, se você executar isso por meio de sourcing, a instância urxvtd será $PPID para o terminal em execução no momento e os terminais all morrerão. Você não quer isso.

    
por 16.05.2012 / 20:13
0

Espero que o script funcione conforme necessário:

#!/bin/sh

termwin=$(xdotool getactivewindow)
while : ; do
    [ $(xdotool getwindowfocus) = $termwin ] || kill -9 $PPID
done
    
por 16.05.2012 / 18:19