我编译了一个简短的 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
似乎错误。