![Bash/xdotool:命令有效,但不在脚本中](https://linux22.com/image/1315068/Bash%2Fxdotool%EF%BC%9A%E5%91%BD%E4%BB%A4%E6%9C%89%E6%95%88%EF%BC%8C%E4%BD%86%E4%B8%8D%E5%9C%A8%E8%84%9A%E6%9C%AC%E4%B8%AD.png)
我正在为 Linux 编写一个 bash 脚本,如果窗口失去焦点,它将关闭终端窗口。
在命令行上,我可以执行以下操作:
termwin=$(xdotool getactivewindow)
while :
do
if [[ $(xdotool getactivewindow) != $termwin ]]
then
exit
fi
done
手动输入到终端中可以正常工作,但如果我将其放入脚本中,则在焦点丢失时脚本不会关闭窗口,而是会停止。没有错误或任何其他内容,只是返回提示。
我感觉我缺少了一些基本的东西。
编辑
读完此文后...: 看这里
我尝试将其作为“.test.sh”而不是“./test.sh”运行,并且成功了。链接描述了这些方法的区别,分别是将脚本作为子进程或作为主进程的一部分运行。有人能解释一下吗,和/或修改脚本以使用“./”而不是“. ”成功运行,后者会产生问题?
答案1
当您使用 执行文件时.
,命令将像在命令行中输入一样运行。这样exit
将退出当前正在运行的 shell。
要退出执行脚本的 shell,您需要获取父进程的进程 ID。您可以尝试运行
kill ${PPID}
在脚本中而不是exit
杀死父 shell(提示:首先尝试回显 pid 并检查它对应的进程,这样你就不会杀死你的 WM 或其他东西)。
如果${PPID}
没有为您执行此操作,您也可以尝试将 pid 作为参数发送给脚本,但这取决于如何以及在何处调用它。
您说您使用了urxtvd
/ urxvtc
。通过该组合,此脚本将终止启动它的终端:
#!/bin/sh
echo kill in 3
sleep 3
kill -1 ${PPID}
所以您应该能够用kill -1
这种方式来杀死单个urxvtc
实例。
请注意,如果你通过采购来运行此程序,则实例urxvtd
将$PPID
用于当前正在运行的终端,并且全部终端将会消亡。你不会希望出现这种情况。
答案2
希望脚本能够按需要工作:
#!/bin/sh
termwin=$(xdotool getactivewindow)
while : ; do
[ $(xdotool getwindowfocus) = $termwin ] || kill -9 $PPID
done