有没有办法在后台启动交互式 CLI 应用程序?(带 &)



我有一个超宽显示器,我喜欢bpytop一直在浏览器旁边的屏幕上运行。

不幸的是,没有办法自动更改正在运行的bpytop实例的配色方案,所以当我运行我出色的昼夜模式脚本时,bpytop会像拇指酸痛一样突出。

我想通过在配置文件更改时自动重新启动bpytop来解决这个问题。这在理论上听起来相对简单:

#!/bin/bash
#
# Wrapper for bpytop that restarts when the config file changes on disk
#
CONFIG_FILE="$HOME/.config/bpytop/bpytop.conf"
trap "kill $BPYTOP_PID &>/dev/null" EXIT
while true; do
bpytop &
BPYTOP_PID=$!
inotifywait -e modify "$CONFIG_FILE"
kill "$BPYTOP_PID"
done

不幸的是,bpytop并不喜欢在后台启动,可能是因为STDIN没有连接到父shell STDIN:

Traceback(最近一次通话最后一次(:文件"/usr/bin/bpytop",第5667行,位于main((文件"/usr/bin/bpytop",第5547行,在main中Term.echo(False(文件"/usr/bin/bpytop",第722行,在echo中(iflag,oflag,cflag,lflag,ispeed,ospeed,cc(=termios.tcgetattr(sys.sdin.fileno(((termios.error:(25,'Inappropriate ioctl for device'(

有没有办法将当前shell的STDIN管道转发到后台运行的应用程序?

当前进程的STDIN文件描述符可以在特殊路径/proc/self/fd/0中找到。您可以使用输入重定向(<(将此文件描述符用作子进程的STDIN。

以下是脚本的一个工作实现:

#!/bin/bash
#
# Wrapper for bpytop that restarts when the config file changes on disk
#
CONFIG_FILE="$HOME/.config/bpytop/bpytop.conf"
trap "kill $BPYTOP_PID &>/dev/null" EXIT
while true; do
bpytop < /proc/self/fd/0 &
BPYTOP_PID=$!
inotifywait -e modify "$CONFIG_FILE"
kill "$BPYTOP_PID"
done

这应该适用于任何交互式终端应用程序。

您也可以使用/dev/stdin,它是/proc/self/fd/0的符号链接,或者您可以简单地使用&0,它是"的特殊语法;我自己的STDIN";,至少在bash和zsh中是这样。例如:

bpytop <&0 &

我在写这个问题的时候发现了答案,但我想我无论如何都会发布它,因为它可能对其他人有用

相关内容

最新更新