Làm thế nào để phát hiện tập lệnh nếu trình giả lập thiết bị đầu cuối đang chạy trong phiên máy tính để bàn hay không?


10

Tôi có các kịch bản tôi chạy mà viết ra một tệp văn bản, sau đó mở nó trong một trình soạn thảo. Nếu tôi mở một cửa sổ giả lập thiết bị đầu cuối trong phiên máy tính để bàn của mình và chạy tập lệnh, tôi muốn trình soạn thảo trở thành một đồ họa như gedit. Nhưng, nếu tôi đã đăng nhập thông qua ConnectBot trên điện thoại hoặc tương tự (không có phiên trên máy tính để bàn), tôi muốn trình chỉnh sửa được nano.

Hiện tại tôi phải duy trì 2 tập lệnh khác nhau, giống hệt nhau ngoại trừ bước cuối cùng (hoặc để đồ họa chạy một lần, tắt lỗi, sau đó mở tệp theo cách thủ công nano). Có hai tập lệnh gần như giống hệt nhau là không hiệu quả từ quan điểm bảo trì.

Kịch bản có thể phát hiện tình huống nào trong số những tình huống này tôi đang ở và mở trình chỉnh sửa chính xác không?

. biết thuật ngữ chính xác để google cho)


6
Nếu tập lệnh của bạn được người khác sử dụng, bạn nên sử dụng chương trình được chỉ định $EDITORtheo mặc định thay vì nanovà dự phòng nanonếu nó không được đặt.
Bakuriu

Cảm ơn, lời khuyên tuyệt vời, và thật tuyệt khi nghe thế nào là thực hành tốt. Chỉ cần tôi mặc dù.
Đá cẩm thạch hữu cơ

Câu trả lời:


13

Bạn có thể sử dụng biến môi trường $DISPLAYlàm kích hoạt trong một ifđiều kiện. Thông thường khi biến này có giá trị bạn có thể chạy các ứng dụng đồ họa.

Đây là một ví dụ :

if [[ -z $DISPLAY ]]
then
    nano
else
    gedit
fi

Toán tử -zsẽ trả về true khi envvar $DISPLAYtrống và tập lệnh của bạn sẽ chạy nano, trong tất cả các trường hợp khác, nó sẽ chạy gedit.


Theo nhận xét này của @ vurp0 :

Trên hầu hết các máy tính để bàn Wayland hiện đại (như máy tính để bàn mặc định trong Fedora và Ubuntu), $DISPLAYvẫn được đặt do khả năng tương thích ngược (thông qua XWayland), nhưng đối với một kịch bản mạnh mẽ hơn, sẽ rất tốt để kiểm tra cả hai $DISPLAY$WAYLAND_DISPLAYchắc chắn.

Tôi sẽ đề nghị sửa đổi biểu thức kiểm tra theo cách sau:

[[ -z ${DISPLAY}${WAYLAND_DISPLAY} ]]

Do đó, các giá trị của hai biến sẽ được nối thành một chuỗi chung, sẽ được xử lý bởi toán tử -z.


Người giới thiệu:


1
Hoặc cho logic rõ ràng:[[ -z ${DISPLAY} && -z ${WAYLAND_DISPLAY} ]]
Tạm dừng cho đến khi có thông báo mới.

7

Thông thường các thiết bị đầu cuối ảo sử dụng thiết bị đầu cuối /dev/ptsgiả . Vì vậy, dựa trên đầu ra của ttylệnh, chúng ta có thể xây dựng một casecâu lệnh đơn giản để xử lý việc mở trình soạn thảo cụ thể:

case "$(tty)" in ; "/dev/pts"*) nano ;; "/dev/tty"*) gedit ;; ;esac

Hoặc được định dạng độc đáo hơn:

case "$(tty)" in
    "/dev/pts"*) gedit ;; 
    "/dev/tty"*) nano ;;
    *) echo "Not suitable tty" > /dev/stderr ;;
esac

So với việc sử dụng các biến môi trường, điều này đáng tin cậy hơn một chút và xem xét nó sử dụng casecâu lệnh với ttylệnh di động hơn một chút. Những gì có lẽ sẽ là tốt nhất là kết hợp cả hai, với thử nghiệm bổ sung, chẳng hạn như"/dev/tty"*) [ -n "$DISPLAY" ] && gedit ;;


Đây không phải là cách sai? Trên bảng điều khiển Ctrl + Alt + F1 của tôi, ttycho /dev/tty1, trong khi gnome-terminal(tab đầu tiên) cho /dev/pts/0.
Paddy Landau

@PaddyLandau Có, geditnên trong /dev/pts*trường hợp. Tôi đã chuyển chúng xung quanh trong khi kiểm tra lỗi trong tty và cuối cùng đã sao chép nó ở đây mà không chuyển trở lại. Cảm ơn, đã chỉnh sửa rồi.
Sergiy Kolodyazhnyy

3

Đây là những gì tôi đã và đang sử dụng:

# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
    notify-send --urgency=critical "$0 cannot be run from GUI without TERM environment variable."
    exit 1
fi

Lý do cho mã này là câu hỏi này: Phím tắt trên màn hình để Bash script bị hỏng và bị cháy

Bạn có thể sửa đổi nó để trông như thế này:

# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
    nano ...
else
    gedit ...
fi
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.