Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash脚本-确定是在终端控制台还是gui中启动脚本_Bash_User Interface_Environment Variables - Fatal编程技术网

Bash脚本-确定是在终端控制台还是gui中启动脚本

Bash脚本-确定是在终端控制台还是gui中启动脚本,bash,user-interface,environment-variables,Bash,User Interface,Environment Variables,如何确定脚本是使用终端控制台启动的,还是不使用终端控制台启动的,例如通过.desktop文件在gui中启动 我已经查看了env输出,一些变量看起来很有希望检查,比如test$TERM var。但我想知道确切的情况,并找到一种兼容/可移植的方法来检查 这是脚本所需要的,该脚本将有两种用户输入行为,回退到终端读取或gui输入 if [ -t 0 ]; then echo "in a terminal"; fi 这将测试文件描述符0,即stdin。如果将脚本作为GUI启动,则该测试应为false 作

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

我已经查看了
env
输出,一些变量看起来很有希望检查,比如test$TERM var。但我想知道确切的情况,并找到一种兼容/可移植的方法来检查

这是脚本所需要的,该脚本将有两种用户输入行为,回退到终端读取或gui输入

if [ -t 0 ]; then echo "in a terminal"; fi
这将测试文件描述符0,即stdin。如果将脚本作为GUI启动,则该测试应为false

作者:


如果脚本是从终端运行的,但带有输入,则此操作将不起作用 已重定向戈登·戴维森

因此,在本次讨论中,终端仿真器是 与linux控制台合并,两者都有别于 “gui方法”,我认为xterm是,因为它在gui中打开- 约瑟夫哈里奥特

此问题的目的是编写可用于文本或gui的脚本界面(如果脚本通过.desktop快捷方式或其他gui方法运行)。

或:

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

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

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

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

  • 应用程序以非交互方式运行,例如从ssh命令、作为未连接STDIO的子进程生成等。
    GUI缺失,STDIN缺失
  • 应用程序通过X-session与.desktop文件或类似文件交互运行<代码>图形用户界面存在,标准数据缺失
  • 应用程序从linux终端(ssh、裸文本控制台、主机恢复控制台等)以交互方式运行<代码>图形用户界面缺失,标准文本存在。应用程序可以通过STDIN以文本模式与用户交互
  • 应用程序从GUI终端应用程序以交互方式运行,如xterm<代码>GUI存在,STDIN存在
  • 有两种基本测试可以帮助识别环境:

    test 1 false + test 2 false: case 1 -- no user interaction available
    test 1  true + test 2 false: case 2 -- interact via XWindows
    test 1 false + test 2  true: case 3 -- interact via STDIN/console
    test 1  true + test 2  true: case 4 -- XWindows or STDIN/console, whichever is preferred
    
  • GUI测试-应用程序是否可以使用图形窗口与用户交互:测试
    $DISPLAY env variable
  • STDIN测试-应用程序是否可以使用文本控制台与用户交互:使用
    if[-t0];测试文件描述符0(也称为STDIN)
  • 结合这两个测试将为您提供以下环境:

    test 1 false + test 2 false: case 1 -- no user interaction available
    test 1  true + test 2 false: case 2 -- interact via XWindows
    test 1 false + test 2  true: case 3 -- interact via STDIN/console
    test 1  true + test 2  true: case 4 -- XWindows or STDIN/console, whichever is preferred
    

    如果脚本是从终端运行的,但输入被重定向,这将不起作用。这与我对脚本的要求(它来自代码审阅站点)是一致的,但是我将添加您的注释来回答。如果您有更好的解决方案,请继续,添加一个答案。对于我来说,在
    Arch Linux
    中,
    [-t 0]
    Linux控制台中的
    true
    。所以这个测试失败了。啊,为了本次讨论的目的,这两种方法被混为一谈,并与我认为是的“gui方法”相区别,因为它是在gui中打开的…@JosephHarriott,对。Linux控制台提供多个虚拟终端,xterm是终端仿真器。此问题的目的是编写可用于文本或gui的脚本界面。不确定您的操作系统和环境,但请尝试根据
    ps-aef
    的输出检查“父进程id”,以查看您是由谁启动的。在bash中,您可以执行
    echo$PPID
    @MarkSetchell我使用的是肉桂ubuntu,但要使脚本可移植,请尝试一下。不应超过50秒;-)好的,我看到了/bin/bash:)@MarkSetchell如果/bin/bash是dash的符号链接呢?在ps输出中检查bash将失败。虽然我的答案适合我的脚本,但我接受你的答案,因为它在各种情况下更有用。