Script para sair e reiniciar o nautilus não funciona

2

Como eu indiquei na minha pergunta problema do tema nautilus em 12.04 eu tenho que digitar 4 comandos após cada logon como solução alternativa para um problema de theming. Como não encontrei uma solução real, decidi colocar os comandos em um script e meu plano é fazer com que esse script inicie automaticamente, desde que funcione corretamente. Os comandos são:

nautilus -q
nautilus -n &
gsettings set org.gnome.desktop.background show-desktop-icons false
gsettings set org.gnome.desktop.background show-desktop-icons true

E este é o meu script:

#!/bin/bash
nautilus -q
pid0=$(pgrep 'nautilus')
while [ -n "$pid" ];
do
  pid=$(pgrep 'nautilus')
  sleep 0
done
nautilus -n
gsettings set org.gnome.desktop.background show-desktop-icons false
gsettings set org.gnome.desktop.background show-desktop-icons true
exit 0

Eu tive que usar o loop e testar, já que de outra forma o nautilus é reiniciado antes de terminar de sair. Mas meu roteiro nunca acaba. Enquanto o pgrep nautilus inserido manualmente em um terminal não retorna nenhum valor após nautilus -q , a execução do script retorna um pid infinito para que o script não seja executado.

Qual é o meu erro? De onde vem o pid quando o comando é executado dentro do script?

E como posso reiniciar o nautilus a partir do script, evitando que o nautilus bloqueie o script para sempre de uma execução posterior? A linha nautilus -n inicia o nautilus e o script trava a partir daí. Usando o nautilus -n & amp; instetead, o script é executado, mas os comandos follwing são executados antes que o nautilus seja completamente iniciado, para que não funcionem como planejado, as configurações da área de trabalho não são aplicadas.

Existe alguma outra idéia para lidar com esse tipo de comando irritante em todos os acessos?

    
por Kermet43 15.02.2013 / 12:50

1 resposta

0

Existem vários problemas aqui. Vamos percorrer o seu script.

  1. Você escreve pid0=$(pgrep 'nautilus') , mas depois testa a variável $pid (não $pid0 ). Eu presumo que você quisesse escrever

    pid=$(pgrep 'nautilus')
    
  2. Se eu entendi corretamente, a intenção do seu loop é interromper a execução do script até que $pid esteja vazio, ou seja, até que nautilus tenha parado de ser executado. Na verdade, o comando nautilus -q enviará um sinal para o aplicativo Nautilus em execução, mas o comando nautilus -q em si já terá terminado com sucesso antes que o aplicativo Nautilus em execução tenha processado esse sinal e tenha terminado com sucesso também. Assim, sua idéia de usar um loop para aguardar a finalização do aplicativo Nautilus é válida. No entanto, esse loop não é executado indefinidamente como você diz. Execute seu script com bash -x para ver o que acontece. Por exemplo, este script:

    #!/bin/bash -x
    nautilus -q
    pid=$(pgrep 'nautilus')
    while [ -n "$pid" ];
    do
      pid=$(pgrep 'nautilus')
      sleep 0
    done
    echo "Nautilus has stopped running!"
    

    ... quando executado enquanto um aplicativo Nautilus está em execução, me fornece a seguinte saída:

    + nautilus -q
    ++ pgrep nautilus
    + pid=24602
    + '[' -n 24602 ']'
    ++ pgrep nautilus
    + pid=24602
    + sleep 0
    + '[' -n 24602 ']'
    ++ pgrep nautilus
    + pid=24602
    + sleep 0
    + '[' -n 24602 ']'
    ++ pgrep nautilus
    + pid=24602
    + sleep 0
    + '[' -n 24602 ']'
    ++ pgrep nautilus
    + pid=24602
    + sleep 0
    + '[' -n 24602 ']'
    ++ pgrep nautilus
    + pid=
    + sleep 0
    + '[' -n '' ']'
    + echo 'Nautilus has stopped running!'
    Nautilus has stopped running!
    

    Como você pode ver, o loop não é executado indefinidamente. No seu caso, o loop nunca é inserido em primeiro lugar, por causa do problema (1). Para responder sua pergunta De onde vem o pid quando o comando é executado dentro do script? - O pid vem do aplicativo Nautilus em execução. O motivo pelo qual você não vê um pid quando executa pgrep nautilus após nautilus -q do Terminal é simples: você não é rápido o suficiente. O tempo que você leva para digitar pgrep nautilus depois de executar nautilus -q é suficiente, e quando você finalmente executa esse comando a partir do terminal, o aplicativo Nautilus já foi encerrado há muito tempo; assim você não vê um pid. Você pode verificar isso digitando nautilus -q; pgrep nautilus (como um único comando) no terminal enquanto um aplicativo Nautilus está em execução: você tem uma boa chance de ver um pid então.

  3. Cosmético: não faz sentido usar sleep 0 , e ter pid=$(pgrep 'nautilus') duas vezes no seu script é um pouco redundante. Comece assim:

    #!/bin/bash
    nautilus -q
    while [ -n "$(pgrep nautilus)" ]
    do :
    done
    
  4. A razão pela qual seu script não termina é diferente do loop: é o comando nautilus -n . Como esse comando não termina (por si só), seu script simplesmente é interrompido. Então você faz tem que executá-lo em segundo plano usando nautilus -n & . Como não há nenhuma maneira fácil de determinar a partir do script se o Nautilus foi "completamente iniciado" de tal forma que as configurações da área de trabalho serão aplicadas (que eu conheço ... exceto por algum código clichê que tentará definir e ler uma configuração fictícia na área de trabalho). um loop para verificar isso), a coisa mais fácil é provavelmente definir um tempo de espera apropriado que funcionará para você na prática, digamos, sleep 2 .

Resumindo , espero que o seguinte funcione para você:

#!/bin/bash

nautilus -q
while [ -n "$(pgrep nautilus)" ]
do :
done

nautilus -n &
sleep 2
gsettings set org.gnome.desktop.background show-desktop-icons false
gsettings set org.gnome.desktop.background show-desktop-icons true
    
por Malte Skoruppa 18.09.2015 / 20:34