Bash脚本-确定是在终端控制台还是gui中启动脚本
如何确定脚本是使用终端控制台启动的,还是不使用终端控制台启动的,例如通过.desktop文件在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 作
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种不同的环境:
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
$DISPLAY env variable
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将失败。虽然我的答案适合我的脚本,但我接受你的答案,因为它在各种情况下更有用。