linux - 是否可以将消息“推送”到活动的 bash 终端?
问题描述
例如通知用户某些任务的状态或报告事件。这不仅应该在登录时发生,而且应该在会话的整个生命周期中发生。如果消息显示被推迟到用户退出应用程序并返回到 shell 时,这是可以的。
通用的 Linux 解决方案是首选,但仅适用于 Ubuntu 的解决方案也可以。
解决方案
首先,一些背景。每个终端都有一个关联的终端设备文件,您可以使用tty
命令获取
% tty
/dev/pts/2
如果程序写入此文件,它将出现在终端上。这是一个例子
% echo "Hi there" > /dev/pts/2
Hi there
现在,您是否可以写入此文件取决于文件的权限
% ls -l /dev/pts/2
crw------- 1 noufal tty 136, 2 Mar 4 10:32 /dev/pts/2
这意味着我可以写入但其他人无法写入(这是合理的,因为我不希望其他人在我的终端上写入)。Prashanth 提到的命令wall
会写入所有用户的终端文件,无论权限如何,因为它以 tty 用户的组权限运行,并且所有终端设备文件也具有相同的组。注意s
下面组的执行权限。
% ls -l /usr/bin/wall
-rwxr-sr-x 1 root tty 27K Mar 7 2018 /usr/bin/wall
单独地,您可以使用 ` 打开或关闭到终端的广播
% mesg
is n
% ls -l /dev/pts/2
crw------- 1 noufal tty 136, 2 Mar 4 10:35 /dev/pts/2
% mesg y
% ls -l /dev/pts/2
crw--w---- 1 noufal tty 136, 2 Mar 4 10:35 /dev/pts/2
现在,为了回答您的问题,如果我写入tty
给定 shell 的文件,我可以在该终端中显示内容,而不管那里运行的是什么。需要注意的是,您需要与运行 shell 的用户是同一用户,或者您的程序必须以 sgid tty 身份运行。
这是一个简单的带注释的 shell 函数,它将在给定的终端上显示正在运行的时钟。
function dclock () {
# Both the tput and date redirect their output to the given tty
# file so that the display occurs over there.
while true
do
tput cup 0 50 > $1 # Position the cursor at row 0 column 50
date > $1 # Print the date
sleep 1
done
}
您可以打开不同的终端 (T),使用tty
命令找到 tty 文件,然后dclock /dev/pts/whatever
在当前终端中运行以查看 T 中出现的时钟。
推荐阅读
- autodesk-forge - 由于详细级别导致的 iLogic 错误不是自定义详细级别
- coq - 在 Coq 中解决合并排序拆分证明
- node.js - 如何将 node.js 文件连接到我的真实网站(不是本地主机)?
- flutter - 如何在 Android 和 ios 的颤振应用中管理图像分辨率?
- microservices - 自定义输出路径的棱镜选择问题
- python - 带有嵌套字段的烧瓶restex @expect
- windows - 如何在 Visual Studio 中构建和安装驱动程序项目?
- mysql - 将 DATEADD() 函数分配给变量
- apache-spark - pyspark 将多个 csv 文件合并为一个
- c# - 有窗口在激活时激活前一个窗口吗?