xdg-bloco aberto até que o processo gerado seja morto

1

Eu tenho muitos documentos para visualizar, e gostaria de visualizá-los um por um, então o próximo abre quando eu fechar o anterior.

Eu já fiz isso com o evince antes, com

for i in 'ls | grep .pdf'; do evince $i; done

No entanto, fazer o mesmo com o xdg-open falha porque o xdg-open não bloqueia como o evince faz.

Existe uma maneira de executar o mesmo loop, mas com o xdg-open, para que quando eu fechar o aplicativo que está aberto, a próxima iteração do loop for seja executada?

    
por Brydon Gibson 05.03.2018 / 16:15

1 resposta

2

Não consegui encontrar um caminho limpo, por isso é uma solução; abra cada arquivo e, em seguida, execute um loop ocupado aguardando a saída do "processo de correspondência". Também atualizei seu loop for para que você não esteja analisando ls e esteja citando o parâmetro filename:

#!/bin/bash

for i in *.pdf
do
  xdg-open "$i"
  t=$(tty)
  t=${t##/dev/}
  s=$(ps -o session= -p $$)
  while pgrep -f "$i" --terminal "$t" --uid "$(id -u)" --session "$s" >/dev/null 2>&1
  do
    sleep 1
  done
done

A suposição aqui é que o xdg-open abrirá o arquivo; esse processo é retirado do ambiente de área de trabalho e o controle retorna ao script. O script, em seguida, reúne o tty, a sessão e o ID do usuário atual e solicita que pgrep procure o processo que corresponde a todos esses critérios:

  • nome completo do processo inclui o nome do arquivo do loop
  • o terminal associado é o que estamos usando
  • o UID do processo corresponde ao nosso
  • a sessão do processo corresponde à nossa

... tudo em uma tentativa de capturar apenas o processo correspondente que o xdg-open iniciou.

Quando esse processo não existir mais, continuaremos com o loop for para o próximo arquivo.

Se o atraso de um segundo for muito longo, você poderá substituí-lo (no Linux) por um sono de sub-segundo ou um simples : para não esperar nada.

    
por 05.03.2018 / 17:36

Tags