Linux shell脚本未完全作为桌面快捷方式执行

Linux shell脚本未完全作为桌面快捷方式执行,linux,shell,desktop-shortcut,Linux,Shell,Desktop Shortcut,我希望创建一个shell脚本,以便在我开始工作时打开一组应用程序。我发现了一些帖子,似乎就是我要找的。问题是,当我双击脚本时,它无法工作 如果我从终端启动脚本,它会完全执行,但我不想总是从终端调用它,我想双击一个快捷方式。如果我在末尾添加一个“sleep 1”,它大部分时间都有效,但这里的问题是1秒并不总是足够执行所有操作。而且,这感觉很不精确。当然,我可以说“sleep 10”就可以了,但作为一名开发人员,这感觉像是一个黑客解决方案 这是我当前的脚本,我打算随着时间的推移将我的应用程序添加到此

我希望创建一个shell脚本,以便在我开始工作时打开一组应用程序。我发现了一些帖子,似乎就是我要找的。问题是,当我双击脚本时,它无法工作

如果我从终端启动脚本,它会完全执行,但我不想总是从终端调用它,我想双击一个快捷方式。如果我在末尾添加一个“sleep 1”,它大部分时间都有效,但这里的问题是1秒并不总是足够执行所有操作。而且,这感觉很不精确。当然,我可以说“sleep 10”就可以了,但作为一名开发人员,这感觉像是一个黑客解决方案

这是我当前的脚本,我打算随着时间的推移将我的应用程序添加到此列表中,但这就足够了:

#!/bin/bash
skype &
/opt/google/chrome/google-chrome &
geany &
mysql-workbench &
所以问题是:我如何确保一切都启动,但不让临时终端窗口打开的时间超过需要的时间

如果有必要,为了创建这个脚本,我只需将一个.sh文件保存到桌面,并在文件属性中选中“允许以程序形式执行文件”

  • 首先,您似乎有一个尾随符号(
    &
    。。。这可能会引起一些问题

  • 其次,您可以执行如下操作,以确保您仅在成功后退出shell(即执行):

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