Bash脚本-确定脚本是否在终端控制台或GUI中启动

时间:2019-02-28 20:11:45

标签: bash user-interface environment-variables

例如,如何通过.desktop文件在gui中查找是使用终端控制台启动还是不使用终端控制台启动的脚本?

我已经查看了env的输出,并且似乎有希望检查一些变量,例如测试$ TERM var。但我想肯定会以一种兼容/便携式的方式知道它。

这是脚本所必需的,它将具有两种用户输入行为,即回退到终端读取或gui输入。

3 个答案:

答案 0 :(得分:2)

if [ -t 0 ]; then echo "in a terminal"; fi

测试文件描述符0,即stdin。如果要以GUI形式启动脚本,则该测试应该为false。

作者:glenn jackman

  

如果脚本是从终端运行的,但是在输入的情况下,这将不起作用   重定向。 –戈登·戴维森

答案 1 :(得分:1)

@LeonidMew的回答不完整,有些不正确。

您不应通过STDIN的存在来检测GUI(这是[-t 0]测试所做的)。在某些情况下,STDIN和GUI都不可用。在非交互模式下通过ssh会话运行脚本时。对于CI部署,通常会发生这种情况。

正确答案在很大程度上取决于您的任务,通常有4种不同的环境:

  1. 应用非交互运行,例如来自ssh命令,作为未附加STDIO的子进程生成,等等。const items = [ { name: "A", data: { title: "B", subData: { val: "AA", anotherData: { subC: [ { name: "Data Item", fruits: ["Apple"] }, { name: "Data Item 2", fruits: ["Orange"] } ] } } } }, { name: "A", data: { title: "B", subData: { val: "AA", anotherData: { subC: [ { name: "Data Item", fruits: ["Apple"] }, { name: "Data Item 2", fruits: ["Orange"] } ] } } } } ] function findItems(searchItem) { return items.filter(item => { return item.data.subData.anotherData.subC.some(di => di.fruits.includes(searchItem)); }) } console.log("Items containing Apple:", findItems("Apple")) // Or Oranges console.log("Items containing Orange:", findItems("Orange"))
  2. 应用程序是通过X.session与.desktop文件等以交互方式运行的。 my_list = [np.random.randint(1, 10000, 1000) for v in range(1000)] my_value = np.random.randint(1, 10000, 1)[0] def v1(my_list): if any(my_value in sublist for sublist in my_list): return True return False def v2(my_list): for sublist in my_list: if my_value in sublist: return True return False print(my_value) %timeit v1(my_list) %timeit v2(my_list) >> 3012 >> 56.9 µs ± 3.1 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each) >> 51.2 µs ± 383 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
  3. App从linux终端(ssh,裸文本控制台,托管恢复控制台等)以交互方式运行。 imgVec.image = UIImage.init(named: "yourImageName") 。应用可以通过STDIN以文本模式与用户互动。
  4. 应用程序是从GUI终端应用程序(如xterm)以交互方式运行的。 GUI is missing, STDIN is missing

有2个基本测试可以帮助识别环境:

  1. GUI测试-应用是否可以使用图形窗口与用户交互:测试GUI is present, STDIN is missing
  2. STDIN测试-应用程序是否可以使用文本控制台与用户交互:使用GUI is missing, STDIN is present测试文件描述符0(aka STDIN)

将这两个测试结合起来可以为您提供环境:

GUI is present, STDIN is present

答案 2 :(得分:0)

或者:

 $ [ -t 0 ] &&  echo "in a terminal" || echo "something else"
 in a terminal