为什么我的 bash 脚本执行后不会退出?

为什么我的 bash 脚本执行后不会退出?

我编译了一个简短的 bash 单行代码来聚焦正在运行的应用程序,或者在它没有运行时启动它:

#!/bin/bash
#intellilaunch.sh

wmctrl -a $1 || $1 & disown
exit 1

当直接从命令行运行时,该命令完全退出:

:~$ wmctrl -a firefox || firefox & disown
[1] 32505

快速检查系统监视器显示只有 Firefox 正在运行。

但是,当我通过脚本 ( ./intellilaunch.sh firefox) 启动 Firefox 时,它会生成一个名为 的持久新进程intellilaunch.sh firefox,该进程仅在关闭 Firefox 后退出。

我究竟做错了什么?

编辑:

我根据michas的建议修改了我的脚本:

#!/bin/bash

program=$(basename $1)

if ! wmctrl -a "$program"; then
  "$1"&
fi

不再是单行文字,但现在效果非常好!

答案1

我无法在我的系统上重现此行为。根据您的描述,听起来好像有一个进程未正确设置为后台。

尝试运行 as bash -x intellilaunch.sh xclock,这应该显示发生了什么。

也比||绑定更强&,因此您在后台发送整个管道。也许明确的if将是一个好主意。

你的

wmctrl -a firefox || firefox & disown ; exit 1

被解释为

( wmctrl -a firefox || firefox ) & disown ; exit 1

而你可能的意思是

wmctrl -a firefox || ( firefox & disown ) ; exit 1 

因此,bash 将启动两项工作,一项使用 wmctl 和 firefox,另一项则使用 disown 和 exit。由于后台作业需要很短的时间来启动,因此它可能会稍晚启动命令,这就是为什么 的输出顺序bash -x似乎错误。

相关内容