วิธีหลอกให้โปรแกรมคิดว่าไม่มีเซิร์ฟเวอร์ X ที่ทำงานอยู่


28

ฉันมีโปรแกรมนี้ที่สามารถรันได้ทั้งส่วนต่อประสานข้อความผู้ใช้และส่วนต่อประสานกราฟิกกับผู้ใช้

มันไม่มีสวิตช์บรรทัดคำสั่งใด ๆ ที่จะบังคับอย่างใดอย่างหนึ่ง แต่ฉันคิดว่ามันจะตรวจจับอัตโนมัติว่าเราอยู่ใน X หรือไม่ (เช่นถ้าฉันเรียกใช้จากเทอร์มินัลเสมือนมันเข้าสู่โหมดข้อความและถ้าฉันเรียกใช้จาก X terminal emulator จะเปิดหน้าต่างกราฟิกแยกต่างหาก)

ฉันต้องการบังคับให้เข้าสู่โหมดข้อความและให้มันทำงานภายในเทอร์มินัล X ฉันจะทำยังไงต่อ

คำตอบ:


40

มักจะเพียงแค่

unset DISPLAY

ในบรรทัดคำสั่งของเทอร์มินัล บางแอ็พพลิเคชันฉลาดกว่านั้นและตรวจสอบสิทธิ์และชนิดของคอนโซลกับ pseudoterminal จริง ๆ


7
น่าเสียดายที่บางซอฟต์แวร์ที่ดื้อรั้นจริงๆจะถือว่าDISPLAY=:0ถ้าไม่ได้ตั้งค่า ฉันเชื่อว่าคุณสามารถแก้ไขได้โดยการเรียกใช้ภายใต้ผู้ใช้อื่นและใช้ iptables เพื่อวาง loopback X11 แต่นั่นค่อนข้างขั้นต้น
เควิน

2
@ เควินอาจจะDISPLAY=invalid:0?
sourcejedi

2
@PeterCordes หรือคุณสามารถดำเนินการคำสั่งผ่านenvแทน subshell:env -u DISPLAY emacs foo.c
pabouk

2
@PeterCordes จะมีสถานะบรรทัดคำสั่งที่จะปิดการใช้งานประเภทเอ็กซ์เพียงemacs emacs -nwแต่หากไม่เป็นเช่นนั้นคุณสามารถใช้แทนDISPLAY= emacsได้
kasperd

2
DISPLAY=0.0.0.0:0ล้มเหลวทันทีโดยไม่ต้องทำการค้นหาเนมเซิร์ฟเวอร์
pts

31

หากคุณต้องการปิดการใช้งาน X สำหรับคำสั่งเดียวคุณสามารถเขียน

DISPLAY= ./my_command

=สังเกตเห็นช่องว่างกลยุทธ์หลัง โดยทั่วไปคุณสามารถตั้งค่าตัวแปรสภาพแวดล้อมสำหรับกระบวนการโดยนำหน้าคำสั่งของคุณด้วยลำดับที่<variable>=<value>คั่นด้วยช่องว่าง เนื่องจาก space ทำหน้าที่เป็นตัวคั่น=ตามด้วยช่องว่างจะล้างตัวแปรก่อนหน้า เราสามารถดูผลของคำนำหน้าเหล่านี้โดยใช้ subshell เป็นคำสั่งแล้วพิมพ์สภาพแวดล้อม ยกตัวอย่างเช่น

$ A=a B=b C= D=d sh
$ echo $A $B $C $D

สิ่งนี้จะพิมพ์

a b d

นี่แสดงให้เห็นว่าสภาพแวดล้อมของ subshell นั้นแตกต่างกันตามที่ตั้งใจไว้ โปรดทราบว่าการทดแทนเชลล์เกิดขึ้นก่อนที่แต่ละอาร์กิวเมนต์จะถูกส่งผ่านไปechoดังนั้นจึงมีเพียงช่องว่างเดียวระหว่างbและdในเอาต์พุตเช่นเดียวกับบรรทัดคำสั่งecho a b d(ด้วยสองช่องว่าง)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.