Bash

捲曲管道腳本分叉一個新的終端視窗

  • May 12, 2022

我有一個腳本,它在某些 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 中新終端的自動生成。

引用自:https://unix.stackexchange.com/questions/702285