我有一个超宽显示器,我喜欢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管道转发到后台运行的应用程序?
/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 &
我在写这个问题的时候发现了答案,但我想我无论如何都会发布它,因为它可能对其他人有用