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
$pidesteja vazio, ou seja, até quenautilustenha parado de ser executado. Na verdade, o comandonautilus -qenviará um sinal para o aplicativo Nautilus em execução, mas o comandonautilus -qem 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 -xpara 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 nautilusapósnautilus -qdo Terminal é simples: você não é rápido o suficiente. O tempo que você leva para digitarpgrep nautilusdepois 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