Linux shell脚本未完全作为桌面快捷方式执行
我希望创建一个shell脚本,以便在我开始工作时打开一组应用程序。我发现了一些帖子,似乎就是我要找的。问题是,当我双击脚本时,它无法工作 如果我从终端启动脚本,它会完全执行,但我不想总是从终端调用它,我想双击一个快捷方式。如果我在末尾添加一个“sleep 1”,它大部分时间都有效,但这里的问题是1秒并不总是足够执行所有操作。而且,这感觉很不精确。当然,我可以说“sleep 10”就可以了,但作为一名开发人员,这感觉像是一个黑客解决方案 这是我当前的脚本,我打算随着时间的推移将我的应用程序添加到此列表中,但这就足够了:Linux shell脚本未完全作为桌面快捷方式执行,linux,shell,desktop-shortcut,Linux,Shell,Desktop Shortcut,我希望创建一个shell脚本,以便在我开始工作时打开一组应用程序。我发现了一些帖子,似乎就是我要找的。问题是,当我双击脚本时,它无法工作 如果我从终端启动脚本,它会完全执行,但我不想总是从终端调用它,我想双击一个快捷方式。如果我在末尾添加一个“sleep 1”,它大部分时间都有效,但这里的问题是1秒并不总是足够执行所有操作。而且,这感觉很不精确。当然,我可以说“sleep 10”就可以了,但作为一名开发人员,这感觉像是一个黑客解决方案 这是我当前的脚本,我打算随着时间的推移将我的应用程序添加到此
#!/bin/bash
skype &
/opt/google/chrome/google-chrome &
geany &
mysql-workbench &
所以问题是:我如何确保一切都启动,但不让临时终端窗口打开的时间超过需要的时间
如果有必要,为了创建这个脚本,我只需将一个.sh文件保存到桌面,并在文件属性中选中“允许以程序形式执行文件”
&
)。。。这可能会引起一些问题#!/bin/bash
skype & /opt/google/chrome/google-chrome & geany & mysql-workbench
if [ $? -eq 0 ]
then
echo "Successfully completed operation (launched files, etc...)"
#use if you don't want to see anything/be notified if successful
## 'exit 0' will exit TERMINAL, therefore the SCRIPT AS WELL
## indicating to the shell that there was NO ERROR (success)
#exit 1
exit 0
## 'return 0' will allow the "successful" message to be written
## to the command-line and then keep the terminal open, if you
## want confirmation of success. The SCRIPT then exits and
## control returns to terminal, but it will not be forced close.
return 0
else
echo "Operation failed!" >&2
## 'exit 1' will exit the TERMINAL, and therefore the SCRIPT AS
## WELL, indicating an ERROR to the shell
#exit 1
## 'return 1' will exit the SCRIPT only (but not the terminal) and
## will indicate an ERROR to the shell
return 1
fi
&
)
你可以做一行。以下命令将按顺序一次一个地运行所有命令,每个命令仅在前一个命令结束时运行。如果&
之间的任何单个命令失败,命令行语句将终止
(skype && /opt/google/chrome/google-chrome && geany && mysql-workbench) && echo "Success!" || echo "fail" &
尝试在每个命令前面加上
nohup
:
#!/bin/bash
nohup skype &
nohup /opt/google/chrome/google-chrome &
nohup geany &
nohup mysql-workbench &
#!/bin/bash
nohup skype&
nohup/opt/google/chrome/googlechrome&
诺胡普·杰尼&
nohup-mysql工作台&
更好的方法是使用循环:
#!/bin/bash
apps="skype /opt/google/chrome/google-chrome geany mysql-workbench"
for app in $apps; do
nohup $app &
done
#!/bin/bash
apps=“skype/opt/google/chrome/google chrome geany mysql工作台”
适用于$apps中的app;做
nohup$app&
完成
如果出现任何错误,请检查
nohup.out
以查看消息。我认为此问题的原因是过早关闭I/O文件(最有可能是TTY)。您可以尝试重定向所有I/O(stdin、stdout、stderr),例如:
skype < /dev/null > /dev/null 2 > /dev/null &
结果是一样的-没有睡眠
程序不会显示。当脚本完成时,它似乎将SIGHUP
发送到shell脚本的pgroup
。您可以通过strace-f
运行上述任何程序来查看它。在清单的末尾应该有kill(PID,SIGHUP)
以非常大的PID值作为参数-实际上它是负数,因此SIGHUP被发送到pgroup中的所有进程
我想很多X11都会被忽略。问题是在更改默认行为之前发送/接收SIGHUP。使用sleep
可以给您一些时间来更改SIGHUP处理
我尝试了disown
(bash内置),但没有帮助(从终端发送到pgroup的SIGHUP,而不是shell)
编辑:
一个可能的解决方案是制作
script.desktop
文件(您可以使用一些现有的.desktop文件作为模板,在Ubuntu上,这些文件位于/usr/share/applications
)并从此文件启动脚本。甚至连不忽略SIGHUP(xclock
)的X11程序都是以这种方式正常启动的。当它不能完全工作时,你是说某些应用程序无法启动吗?同样的?最后一个?随机的?另外,您是否考虑过在桌面环境中设置自动启动应用程序?澄清一下,没有一个应用程序启动。我只是看到一个闪烁的终端窗口。奇怪的是,它通过终端(在同一个用户下运行,而不是以root用户身份运行)或者如果我在脚本末尾添加“sleep”,它的执行效果会很好。我不想自动启动任何应用程序,因为这是一台个人计算机,只是偶尔用于工作目的。这似乎可以工作,但有几次终端窗口没有关闭,它仍然连接到进程。我的意思是,如果我关闭终端窗口,它打开的所有应用程序也会立即关闭!不幸的是,只有Skype通过这个命令打开,当我关闭悬挂终端窗口时,它同时杀死了Skype!这两种方法都会导致终端窗口短暂闪烁,而实际上什么都没有执行。正如我在上面发布的示例中所示,在从终端调用时,由于某些原因,这是有效的,而在双击快捷方式时则不行。双击执行时不会生成“nohup.out”文件。这种循环方法是合理的,但做得不好<代码>应用程序不应该是字符串,它应该是数组apps=(app1 app2“app 3”…)
并且循环应该是“${apps[@]}”中应用程序的;执行
以允许应用程序使用空格和shell元字符。什么也不会发生:-/如果发布的解决方案都不起作用,我认为我的环境一定有问题。我正在运行Linux Mint 16.1,除了安装一些应用程序外,只做了一些修改。@CauselessEffect,对,可能会重现这个问题。到目前为止,我找到的唯一解决方法是使用.desktop
文件(答案已更新)。感谢您为帮助我解决此问题付出了如此多的努力!我看了两个示例.desktop文件,我猜我关心的行是“Exec=/”。不过,我不熟悉这些文件的使用位置,我该如何进行测试?@CauselessEffect,不用客气,我在这里也学到了一些东西。是的,只需将Exec=
更改为指向脚本即可。然后双击该文件,就像对原始脚本所做的那样。可以作为一个快速的介绍。
#!/bin/sh
{
skype &
/opt/google/chrome/google-chrome &
geany &
mysql-workbench &
} < /dev/null > /dev/null 2 > /dev/null &
/usr/bin/gnome-terminal -x /bin/sh -c ./test.sh
xterm -e ./test.sh`