为什么这个 Fish 脚本不从启动器运行?

为什么这个 Fish 脚本不从启动器运行?

我编写了以下脚本,旨在启动守护进程并显示 Zenity 窗口,然后在窗口关闭时停止守护进程:

#!/usr/bin/fish

if not ps aux | grep [s]erviio > /dev/null
    set -x JAVA "/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java"

    ~/Programs/serviio/bin/serviio.sh &

    zenity --info --text="Serviio is running.\nClick OK to stop." --title="Serviio"

    ~/Programs/serviio/bin/serviio.sh -stop
end

如果我从终端运行脚本,它就可以正常工作。它也可以在 bash 终端上运行,这似乎表明 shebang 正在按预期工作。

但是,如果我创建一个启动器来指向该脚本并尝试运行它,什么也不会发生。Serviio 不会启动(我可以从 确认这一点ps aux),也不会显示 Zenity 窗口。

我试图找出导致问题的脚本的原因,但没有取得任何成功。

  • 如果我删除 Serviio 是否正在运行的测试,该脚本将起作用。
  • 如果我保留检查,但让脚本在 Zenity 窗口中显示 $JAVA 的内容而不是启动 Serviio,它就会起作用。

换句话说,我无法识别脚本中任何会阻止其运行的元素。

可能是什么问题呢?

答案1

我通过将命令的输出重定向ps到文件找到了原因。如果我从启动器运行脚本,grep 会找到脚本本身(名称中包含“serviio”),因此它不会执行“if”内的代码。

我通过使 grep 查找的内容更加具体来修复它。

主要原因似乎是,如果脚本直接从终端运行,它不会显示为进程,但如果它从启动器运行,则解释器(在本例中为fish)会以脚本作为参数出现。

相关内容