2017-04-19 26 views
0

我试图在我的Ubuntu 16.04盒子中插入Android设备时,向我的交互式终端打印一些文本。有没有办法让我的bash陷阱处理程序立即执行?

我提出的解决方案涉及一个自定义udev规则,该规则执行一个脚本,该脚本将kill -SIGUSR1发送到我系统上的所有bash进程。

udev规则:

ACTION=="add", SUBSYSTEM=="usb", ENV{adb_user}=="yes", RUN+="/bin/bash /script/location/onconnect.sh %k" 

onconnect.sh:

if [[ ${*} != *":"* ]]; then 
    for p in $(ps -U username | grep bash | cut -d" " -f1); do 
     kill -SIGUSR1 $p 
    done 
fi  

上述作品。不过,如果我在终端中按下Enter键,似乎我放入环境中的陷阱处理程序才会被调用。有没有办法中断正在等待命令并立即打印的bash线程?我用它来安装我的陷阱rc文件看起来是这样的:

... 

function deviceadded() { 
    echo "you've plugged in a device!" 
} 

trap "(deviceadded&)" SIGUSR1 

... 

在我的命令行,它有点像这样当信号成为:

[~]$ 
[~]$ you've plugged in a device! 

[~]$ _ 

但是,文本仅在我进入后显示。我以前从未使用bash trap,所以它可能只是误解它的工作原理。有没有办法让它立即打印?

有没有更好的方法来解决这个问题?

编辑:添加了udev规则和udev目标脚本。

+0

在我的系统上,消息立即显示,但提示只在我点击返回键后重新显示。那也是你的经历吗? – Fred

+0

@Fred不,对我来说,我需要在看到任何东西之前先进入。然后打印消息,然后我需要再次点击输入才能让我的提示恢复。你看到的行为更接近我想要的。我更新了我的帖子,包括udev规则和目标脚本,也许是在那里的延迟? – awm129

回答

0

我相信会发生这种情况,因为您在陷阱中的命令是在后台运行的。

尝试设置陷阱命令一样:

trap deviceadded SIGUSR1 

,看看会发生什么。

+0

将陷阱处理程序放在前台 - 使用您的代码 - 似乎给了我在原始文章中看到的相同的延迟执行。 – awm129

相关问题