Làm cách nào để kiểm tra lập trình nếu có thể kết nối với máy chủ X được chỉ định trong $ HIỂN THỊ


8

Đây là một chút trung gian giữa lập trình và quản trị viên máy chủ, nhưng đây dường như là nơi phù hợp nhất cho nó.

Tôi đang tìm cách để xác định xem biến ' $DISPLAY' có đang quảng cáo cho XServer mà chúng ta thực sự có thể kết nối hay không, nghĩa là, nếu tất cả xác thực và không có gì để cho phép thực hiện thêm.

Tôi lý tưởng tìm kiếm một công cụ shell-end trả về true / false, có thể được sử dụng trong tập lệnh xây dựng để xác định xem các thử nghiệm khác trong nó (mà tôi không kiểm soát) có nên chạy hay không.

Các thử nghiệm hiện tại chỉ đơn giản là kiểm tra envbiến " $DISPLAY" và nếu có, sẽ thử kết nối và khi kết nối không hoạt động, các thử nghiệm giả định thất bại của thử nghiệm, không chỉ đơn giản là màn hình không kết nối được.

Tôi chỉ cần có thể làm

if [[ ! can_connect_to_X ]] ; then 
    unset DISPLAY
fi

Để ngăn chặn các xét nghiệm có vấn đề nghiêm trọng về tinh thần.

Trong một tình huống lý tưởng, công cụ cần thiết để làm điều này phải được cung cấp cùng với các thư viện X Client, để không phải chịu các phụ thuộc đặc biệt và để có thể giả sử nếu tiện ích không có ở đó, chúng tôi không thể kết nối với bất kỳ màn hình nào.

Câu trả lời:



2

Tôi đoán có một giải pháp tốt hơn. Nhưng bạn luôn có thể chỉ cần sử dụng một công cụ nhỏ như xclock và kiểm tra trạng thái thoát.

if [[ ! xclock ]]; then
  exit 1
fi
pkill xclock

Nhưng bạn ơi, thật xấu xí :-)

Ít Hacky hơn, hãy đặt những điều sau vào checkX.c:

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

int main() 
{
    Display *display;
    if( ! (display=XOpenDisplay(NULL) ) ) {
        return(1);
    }
    return 0;
}

Sau đó:

gcc -lX11 checkX.c -o checkX
chmod +x checkX

Cuối cùng:

if ./checkX; then
   echo "We are good to go!"
fi

Vâng, đó là điều đầu tiên tôi xem xét, nhưng tôi muốn một cái gì đó không trực quan tạo ra một cửa sổ: /. Tôi thậm chí đã cân nhắc làm xclock & và sau đó giết nó.
Kent Fredric

xclock -geometry 1x1 là cách tốt nhất tôi có thể làm để loại bỏ sự xâm nhập trực quan: /, nhưng nó cũng phân bổ một không gian nhiệm vụ trên thanh tác vụ :(
Kent Fredric

Đó là chương trình X đầu tiên tôi từng viết bằng C, vì vậy, không chắc nó có hoàn toàn đáng tin cậy hay không :-)
Kyle Brandt

Và không phải là thứ dễ mang theo nhất ;-)
Kyle Brandt

Điều đó khá tiện dụng, thật không may, những hạn chế của tôi có phần chặt chẽ hơn. Sự thật mà nói, tôi đang viết một ebuild (gentoo), vì vậy tôi hầu như phải làm / mọi thứ / trong vỏ, và giả sử rằng các ứng dụng sẽ ở đó trước và tôi không thể thêm các đốm nhị phân trước ứng dụng của bên thứ 3 :)
Kent Fredric

1

Đây là một WayToDoIt có thể, mặc dù không chắc nó tốt như thế nào.

  x_works(){
     # If there is no xdpyinfo
     # Bash will return 127
     # If X cant connect, it returns 1
     # If X can connect, it returns 0
     xdpyinfo 1>/dev/null 2>&1
     WORKS="$?"
     return $WORKS
  }

  if x_works; then 
   ...

Điều này dường như đang làm việc.


Trên máy Fedora 11 của tôi, tôi đang nhận được: $ xdpyinfo 1 cách sử dụng: xdpyinfo [tùy chọn] Dù sao, tôi nghĩ rằng nó có vẻ là một ý tưởng tốt để sử dụng chương trình xdpyinfo.
Cristian Ciupitu

'1' có chuyển hướng stderr cho bash;), không phải là thông số xdpyinfo :)
Kent Fredric
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.