退出并重新启动 nautilus 的脚本不起作用

退出并重新启动 nautilus 的脚本不起作用

正如我在问题中指出的那样12.04 中的 nautilus 主题问题每次登录后,我都必须输入 4 条命令来解决主题问题。由于我没有找到真正的解决方案,我决定将命令放入脚本中,我的计划是让此脚本在正常运行后自动启动。命令如下:

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

这是我的脚本:

#!/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

我必须使用循环和测试,否则 nautilus 会在退出之前重新启动。但我的脚本永远不会结束。虽然pgrep nautilus在终端中手动输入后没有返回任何值鹦鹉螺-q,运行脚本会返回无限的 pid,因此脚本不会被执行。

我的错误是什么?在脚本中运行命令时,pid 来自哪里?

我怎样才能在脚本中重新启动 nautilus,避免 nautilus 永远阻止脚本进一步执行?鹦鹉螺-n启动 nautilus,脚本从此挂起。使用鹦鹉螺-n&相反,它使脚本运行,但是在 nautilus 完全启动之前执行了以下命令,因此它们无法按预期工作,桌面设置也不会应用。

还有其他方法可以解决每次登录时输入这种烦人的命令吗?

答案1

这里有几个问题。让我们来看看你的脚本。

  1. 你写了pid0=$(pgrep 'nautilus'),但之后测试变量$pid(而不是$pid0)。我假设你的意思是写

    pid=$(pgrep 'nautilus')
    
  2. 如果我理解正确的话,循环的目的是暂停脚本的执行,直到$pid为空,即直到nautilus停止运行。实际上,该命令nautilus -q将向正在运行的 Nautilus 应用程序发送退出信号,但nautilus -q在正在运行的 Nautilus 应用程序处理该信号并成功终止自身之前,命令本身已经成功终止。因此,您使用循环等待 Nautilus 应用程序终止的想法是有效的。但是,该循环不会像您所说的那样无限期地运行。使用 运行您的脚本以bash -x查看会发生什么。例如,此脚本:

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

    ...在 Nautilus 应用程序运行时执行时,给出以下输出:

    + 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!
    

    如您所见,循环不会无限期地运行。 在您的例子中,由于问题 (1),循环从未进入。 回答您的问题在脚本中运行命令时,pid 来自哪里?-- pid 来自正在运行的 Nautilus 应用程序。在pgrep nautilusnautilus -q终端pgrep nautilus原因很简单:你速度不够快。运行后输入命令所花的时间nautilus -q很长,当你最终从终端运行该命令时,Nautilus 应用程序早已终止;因此你看不到 pid。你可以在nautilus -q; pgrep nautilusNautilus 应用程序运行时在终端中输入(作为单个命令)来检查这一点:你很有可能看到 pid。

  3. 修饰: 没有任何意义sleep 0,而且pid=$(pgrep 'nautilus')在脚本中出现两次有点多余。像这样开始:

    #!/bin/bash
    nautilus -q
    while [ -n "$(pgrep nautilus)" ]
    do :
    done
    
  4. 脚本没有结束的原因不是循环,而是命令nautilus -n。由于此命令不会(自行)终止,因此脚本会挂起。因此,您必须使用 在后台运行它nautilus -n &。由于没有简单的方法可以从脚本中确定 Nautilus 是否已“完全启动”以便应用桌面设置(据我所知……除了一些丑陋的样板代码,这些代码将尝试在循环中设置和读取虚拟桌面设置以检查这一点),最简单的方法可能是设置一个在实践中适合您的适当等待时间,例如sleep 2

加起来,我希望以下内容对您有用:

#!/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

相关内容