จะตรวจสอบสคริปต์ได้อย่างไรว่าเทอร์มินัลอีมูเลเตอร์ทำงานในเซสชันเดสก์ท็อปหรือไม่


10

ฉันมีสคริปต์ที่ฉันเรียกใช้ซึ่งเขียนไฟล์ข้อความจากนั้นเปิดในโปรแกรมแก้ไข ถ้าผมเปิดหน้าต่างจำลอง terminal geditในเซสชั่นสก์ท็อปของฉันและเรียกใช้สคริปต์ฉันต้องการแก้ไขที่จะเป็นหนึ่งในกราฟิกเช่น แต่ถ้าฉันเข้าสู่ระบบผ่าน ConnectBot บนโทรศัพท์หรือคล้ายกัน (เซสชั่นสก์ท็อปไม่ได้) nanoของฉันฉันต้องการแก้ไขให้เป็น

ขณะนี้ฉันต้องรักษา 2 สคริปต์ที่แตกต่างกันเหมือนกันยกเว้นสำหรับขั้นตอนสุดท้าย (หรือปล่อยให้กราฟิกหนึ่งทำงานผิดพลาดจากนั้นเปิดไฟล์ด้วยตนเองnano) การมีสองสคริปต์ที่เหมือนกันส่วนใหญ่ไม่มีประสิทธิภาพจากมุมมองการบำรุงรักษา

สคริปต์สามารถตรวจสอบว่าฉันอยู่ในสถานการณ์ใดและเปิดตัวแก้ไขที่ถูกต้องหรือไม่

(ฉันได้พบวิธีสำหรับสคริปต์ในการตรวจสอบว่ามันกำลังทำงานอยู่ในหน้าต่างเทอร์มินัลอีมูเลเตอร์หรือโดยการดับเบิลคลิก แต่ยังไม่พบวิธีตรวจสอบว่าหน้าต่างกำลังทำงานอยู่บนเดสก์ท็อป ... ฉันไม่คิดว่าฉัน รู้คำศัพท์ที่ถูกต้องเพื่อ google สำหรับ)


6
หากบุคคลอื่นใช้สคริปต์ของคุณคุณควรใช้โปรแกรมที่ระบุไว้เป็น$EDITORค่าเริ่มต้นแทนnanoและใช้ทางเลือกอื่นnanoหากไม่ได้ตั้งค่าไว้
Bakuriu

ขอบคุณคำแนะนำที่ยอดเยี่ยมและเป็นเรื่องดีที่ได้ทราบว่าการปฏิบัติที่ดีเป็นอย่างไร แค่ฉันว่า
หินอ่อนหินอ่อน

คำตอบ:


13

คุณสามารถใช้ตัวแปรสภาพแวดล้อม$DISPLAYเป็นทริกเกอร์ภายในifเงื่อนไข โดยปกติเมื่อตัวแปรนี้มีค่าคุณจะสามารถเรียกใช้โปรแกรมประยุกต์แบบกราฟิก

นี่คือตัวอย่าง :

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

ผู้ประกอบการ-zจะกลับมาจริงเมื่อ envvar $DISPLAYเป็นที่ว่างเปล่าและสคริปต์ของคุณจะทำงานnanoในกรณีอื่น ๆ geditทั้งหมดก็จะทำงาน


ตามความคิดเห็นของ@ vurp0 นี้ :

ในส่วนเดสก์ท็ Wayland ทันสมัย (เช่นสก์ท็อปเริ่มต้นใน Fedora และ Ubuntu) $DISPLAYยังคงกำหนดเนื่องจากการทำงานร่วมกันหลัง (ผ่าน XWayland) แต่สำหรับสคริปต์ที่แข็งแกร่งมากขึ้นก็จะดีในการทดสอบสำหรับทั้งสอง$DISPLAYและ$WAYLAND_DISPLAYเพื่อให้แน่ใจว่า

ฉันขอแนะนำให้แก้ไขนิพจน์ทดสอบด้วยวิธีต่อไปนี้:

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

-zดังนั้นค่าของตัวแปรทั้งสองจะถูกตัดแบ่งเป็นสตริงร่วมกันซึ่งจะดำเนินการโดยผู้ประกอบการ


อ้างอิง:


1
หรือสำหรับตรรกะที่ชัดเจน:[[ -z ${DISPLAY} && -z ${WAYLAND_DISPLAY} ]]
หยุดชั่วคราวจนกว่าจะมีประกาศเพิ่มเติม

7

โดยปกติอาคารเสมือนใช้หลอกขั้ว/dev/pts ดังนั้นตามผลลัพธ์ของttyคำสั่งเราสามารถสร้างcaseคำสั่งง่ายๆเพื่อจัดการกับการเปิดเอดิเตอร์เฉพาะ:

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

หรือจัดรูปแบบได้ดีกว่า:

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

เมื่อเทียบกับการใช้ตัวแปรสภาพแวดล้อมสิ่งนี้จะมีความน่าเชื่อถือมากขึ้นเล็กน้อยและเมื่อพิจารณาว่าใช้caseคำสั่งที่มีttyคำสั่งแบบพกพามากกว่านี้เล็กน้อย สิ่งที่น่าจะดีที่สุดคือการรวมทั้งสองอย่างเข้ากับการทดสอบพิเศษเช่น"/dev/tty"*) [ -n "$DISPLAY" ] && gedit ;;


นี่ไม่ใช่วิธีที่ผิดใช่มั้ย บนคอนโซล Ctrl + Alt + F1 ของฉันttyให้/dev/tty1ในขณะที่gnome-terminal(แท็บแรก) /dev/pts/0ให้
Paddy Landau

@ PaddyLandau ใช่geditควรเป็นใน/dev/pts*กรณี ฉันสลับพวกเขาไปรอบ ๆ ในขณะที่การทดสอบข้อผิดพลาดใน tty และสิ้นสุดการคัดลอกที่นี่โดยไม่ต้องเปลี่ยนกลับ ขอขอบคุณแก้ไขแล้ว
Sergiy Kolodyazhnyy

3

นี่คือสิ่งที่ฉันใช้:

# $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

เหตุผลสำหรับรหัสนี้คือคำถามนี้: ทางลัดบนเดสก์ท็อปไปยังสคริปต์ Bash หยุดทำงานและเบิร์น

คุณสามารถปรับเปลี่ยนให้เป็นดังนี้:

# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
    nano ...
else
    gedit ...
fi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.