2016-10-18 122 views
0

我正在編寫一個shell腳本,需要根據是否存在特定的X11擴展名來區分其行爲併爲被調用的程序提供不同的選項。我有一個工作解決方案,但我希望有一個更清潔的解決方案。我願意考慮一個簡單的c程序來做測試並返回結果。這裏是我工作的最小功能例如:檢查X11擴展

#!/bin/sh 
xdpyinfo |sed -nr '/^number of extensions/,/^[^ ]/s/^ *//p' | \ 
    grep -q $EXTENSION && echo present 

我覺得有一種方法可以簡化的sed,grep的,但我真的不希望解析xdpyinfo

回答

1

你也有C-tag,所以讓我建議你自己去做xdpyinfo。下面的C程序打印只是擴展:

#include <X11/Xlib.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

static int compare(const void *a, const void *b) 
{ 
    return strcmp(*(char **) a, *(char **) b); 
} 

static void print_extension_info(Display * dpy) 
{ 
    int n = 0, i; 
    char **extlist = XListExtensions(dpy, &n); 


    printf("number of extensions: %d\n", n); 
    if (extlist) { 
    qsort(extlist, n, sizeof(char *), compare); 
    for (i = 0; i < n; i++) { 

     printf(" %s\n", extlist[i]); 

    } 
    } 
    // TODO: it might not be a good idea to free extlist, check 
} 

int main() 
{ 
    Display *dpy; 
    char *displayname = NULL; 

    dpy = XOpenDisplay(displayname); 
    if (!dpy) { 
    fprintf(stderr, "Unable to open display \"%s\".\n", 
      XDisplayName(displayname)); 
    exit(EXIT_FAILURE); 
    } 

    print_extension_info(dpy); 

    XCloseDisplay(dpy); 
    exit(EXIT_SUCCESS); 
} 

編譯如:GCC

gcc -O3 -g3 -W -Wall -Wextra xdpyinfo1.0.2.c $(pkg-config --cflags --libs x11) -o xdpyinfo1.0.2 

(應該給出一個有關未使用的argc警告,但這是無害的)

只要改變printf()的到你想要的格式。

+0

非常感謝,這看起來讓我獲得了大部分途徑,但是取消辛苦工作成爲替代xdpyinfo的努力是件可恥的事情,但那僅僅是一些printfs。 – hildred

+0

@hildred如果你做得太多,會讓你感到頭疼,如果你也做得太過分了...... *嘆*這個小程序列出了擴展名。你想讓我擴大它接受命令行的查詢,或者你可以自己做嗎? – deamentiaemundi

+0

不,我的c沒有那麼糟糕,我可以從這裏拿它,這是我生鏽的X11的東西。我很快就會在github上發佈它。你對gpl3許可證有什麼看法? – hildred