阻止 bash 命令 GUI 打开

阻止 bash 命令 GUI 打开

我目前正在尝试从 .desktop 文件中提取我需要的所有信息。

下面的内容已经足够好了,但有一个缺点。

因为有时 .desktop 文件中的 EXEC 行会生成额外的进程,所以我必须运行每个文件才能获取预期的进程名称,因为这样我就可以稍后终止它。

目前来说这很好,但有时 GUI 会闪烁一秒钟,然后在我发出终止命令后关闭。

我的问题是,有没有一种简单的方法可以在没有 GUI 的情况下运行命令,并且适用于所有情况。

有没有办法在完全隐藏 GUI 的同时运行命令?

我的剧本

#!/bin/bash
for filename in /usr/share/applications/*.desktop /var/lib/snapd/desktop/applications/*.desktop; do

    #try and get command line
    CMD=$(grep -Po "(?<=^Exec=).+\s" "$filename" | tail -1)
    $CMD &>/dev/null &
    PID="$!"

    #if no pid or comand found try another approach
    if [[ -z "$CMD" ]] || [[ -z "$PID" ]]  
    then
        CMD=$(grep '^Exec=' "$filename" | tail -1 | sed 's/^Exec=//')
        $CMD &>/dev/null &
        PID="$!"
        if [[ -z "$CMD" ]] || [[ -z "$PID" ]] 
        then
            # if nothing then skip --- TODO fix this 
            continue
        fi
    fi

    name=$(ps --no-header $PID | awk '{print $5}')
    
    
    if [[ -z "$name" ]]
    then
        :
        #echo $CMD
        #echo $filename has no name
    else
        #extract the categories from the file
        categories=$(grep '^Categories' "$filename" | tail -1 | sed 's/^Categories=//' | sed 's/%.//' | sed 's/^"//g' | sed 's/" *$//g')
        #get icon location
        icon=$(grep '^Icon' "$filename" | tail -1 | sed 's/^Icon=//' | sed 's/%.//' | sed 's/^"//g' | sed 's/" *$//g')
        
        if [[ $icon == /* ]] 
        then
            icons=$icon
        else
            icons=$(find "/usr/share/icons/" -name "*$icon.*")
        fi

        #get icon file paths

        echo {"pid":$PID, "name":$name, "filename":$filename, "cmd":$CMD, "categories":$categories, "icons":$icons}
    fi

    kill -SIGTERM $PID &>/dev/null
    #echo KILLING 
done

答案1

我找到了解决方案 - 不确定是否有更好的方法但是

这里

使用 xvfb,它是一个虚拟帧缓冲区。

搜索结果 来自网络的精选片段 Xvfb(X 虚拟帧缓冲区的缩写)是用于类 UNIX 操作系统(例如 Linux)的内存中显示服务器。它使您能够在没有显示器的情况下运行图形应用程序(例如,CI 服务器上的浏览器测试),同时还能够截取屏幕截图。

安装ubuntu等

sudo apt-get install xvfb

要使用...创建缓冲区:

Xvfb :100 &

然后将显示设置为伪显示

export DISPLAY=:100

您在该终端会话中运行的所有内容现在都显示为隐藏运行。

相关内容