正如我在问题中指出的那样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
这里有几个问题。让我们来看看你的脚本。
你写了
pid0=$(pgrep 'nautilus')
,但之后测试变量$pid
(而不是$pid0
)。我假设你的意思是写pid=$(pgrep 'nautilus')
如果我理解正确的话,循环的目的是暂停脚本的执行,直到
$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 nautilus
从nautilus -q
终端pgrep nautilus
原因很简单:你速度不够快。运行后输入命令所花的时间nautilus -q
很长,当你最终从终端运行该命令时,Nautilus 应用程序早已终止;因此你看不到 pid。你可以在nautilus -q; pgrep nautilus
Nautilus 应用程序运行时在终端中输入(作为单个命令)来检查这一点:你很有可能看到 pid。修饰: 没有任何意义
sleep 0
,而且pid=$(pgrep 'nautilus')
在脚本中出现两次有点多余。像这样开始:#!/bin/bash nautilus -q while [ -n "$(pgrep nautilus)" ] do : done
脚本没有结束的原因不是循环,而是命令
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