背景
我有一个需要用户输入的 Bash 脚本。可以通过在终端中调用它或按下在 i3(或 Sway)配置文件中注册的键盘快捷键来运行它,如下所示:
bindsym --release $mod+Shift+t exec /usr/local/bin/myscript
问题
我知道我可以read -p
用来在终端中提示,但是当脚本通过键绑定触发时,这显然不起作用。在这种情况下,我可以使用Yad之类的东西来创建 GUI,但我无法检测到它何时不在“终端中”。本质上我希望能够做这样的事情:
if [ $isInTerminal ]; then
read -rp "Enter your username: " username
else
username=$(yad --entry --text "Enter your username:")
fi
我如何(自动)检查我的脚本是从键绑定调用的,还是在终端中运行?理想情况下,这应该没有用户指定的命令行参数。其他人可能会使用该脚本,因此,我想避免通过“被遗忘的标志”引入任何用户错误的可能性。
尝试“解决方案”
这个问题建议检查是否stdout
要去终端,所以我创建了这个测试脚本:
#!/usr/bin/env bash
rm -f /tmp/detect.log
logpass() {
echo "$1 IS opened on a terminal" >> /tmp/detect.log
}
logfail() {
echo "$1 IS NOT opened on a terminal" >> /tmp/detect.log
}
if [ -t 0 ]; then logpass stdin; else logfail stdin; fi
if [ -t 1 ]; then logpass stdout; else logfail stdout; fi
if [ -t 2 ]; then logpass stderr; else logfail stderr; fi
但是,这并不能解决我的问题。无论我是./detect.sh
在终端中运行还是通过键绑定触发它,输出总是相同的:
$ cat /tmp/detect.log
stdin IS opened on a terminal
stdout IS opened on a terminal
stderr IS opened on a terminal