我有一个脚本无法解释地在某些 Linux 发行版上分叉了一个新的终端实例...我宁愿它不这样做。奇怪的是,当我直接运行脚本 ( ./install.sh
) 时,不会创建额外的终端实例。
curl qz.sh | bash # warning this will install a Linux Desktop App you may not want :)
- 在MacOS 莫哈维: 工作正常
- 在乌班图22.04:在虚拟机中正常工作
- 在软呢帽 34:在虚拟机中正常工作
- 在乌班图20.10:据报道产生了一个新的终端
- 在Manjaro XFCE:工作正常,直到到达
sudo ...
脚本中的命令并生成新的终端实例
完整源代码这里。
有问题的代码如下:
# Install using unattended techniques: https://github.com/qzind/tray/wiki/deployment
echo -e "Download successful, beginning the install..."
case $OSTYPE in
"darwin"*)
# Assume .pkg (installer) for MacOS
sudo installer -pkg "$TEMP_FILE" -target /
;;
*)
# Assume .run (makeself) for others
if which sudo >/dev/null 2>&1 ; then
# use "sudo" if available
sudo bash "$TEMP_FILE" -- -y
else
# fallback to "su -c"
su root -c "bash '$TEMP_FILE' -- -y"
fi
;;
esac
问题:为什么这会在某些环境中生成新的终端实例?如何防止这种情况发生?
答案1
直接运行安装程序时未创建终端的原因是 makeself 用于tty -s
确定它是否已在终端中运行,请参阅GitHub 上的源代码。运行时,curl qz.sh | bash
您打开的管道在直接运行脚本时不存在,导致测试tty -s
失败。
为了防止终端被打开,您可以使用 makeself 的--nox11
标志,引用自述文件:
--nox11 :禁用 X11 中自动生成新终端。