Existem vários problemas aqui. Vamos percorrer o seu script.
-
Você escreve
pid0=$(pgrep 'nautilus')
, mas depois testa a variável$pid
(não$pid0
). Eu presumo que você quisesse escreverpid=$(pgrep 'nautilus')
-
Se eu entendi corretamente, a intenção do seu loop é interromper a execução do script até que
$pid
esteja vazio, ou seja, até quenautilus
tenha parado de ser executado. Na verdade, o comandonautilus -q
enviará um sinal para o aplicativo Nautilus em execução, mas o comandonautilus -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 combash -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ósnautilus -q
do Terminal é simples: você não é rápido o suficiente. O tempo que você leva para digitarpgrep nautilus
depois de executarnautilus -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 digitandonautilus -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. -
Cosmético: não faz sentido usar
sleep 0
, e terpid=$(pgrep 'nautilus')
duas vezes no seu script é um pouco redundante. Comece assim:#!/bin/bash nautilus -q while [ -n "$(pgrep nautilus)" ] do : done
-
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 usandonautilus -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