Bash/xdotool:命令有效,但不在脚本中

Bash/xdotool:命令有效,但不在脚本中

我正在为 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

相关内容