Bash
捲曲管道腳本分叉一個新的終端視窗
我有一個腳本,它在某些 Linux 發行版上無法解釋地分叉一個新的終端實例……我寧願它不這樣做。奇怪的是,當我直接執行腳本 (
./install.sh
) 時,不會創建額外的終端實例。curl qz.sh | bash # warning this will install a Linux Desktop App you may not want :)
- 在MacOS Mojave上:正常工作
- 在Ubuntu 22.04上:在 VM 中正常工作
- 在Fedora 34上:在 VM 中正常工作
- 在Ubuntu 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
問題:為什麼這會在某些環境中產生一個新的終端實例,我該如何防止這種情況發生?
直接執行安裝程序時沒有創建終端的原因是 makeself 用來
tty -s
確定它是否已經在終端中執行,請參閱GitHub 上的原始碼。執行時,curl qz.sh | bash
您打開的管道在直接執行腳本時不存在,導致tty -s
測試失敗。為了防止終端被打開,你可以使用 makeself 的
--nox11
標誌,引用自述文件:–nox11 :禁用 X11 中新終端的自動生成。