Bagaimana mengelabui suatu program agar berpikir tidak ada X server yang berjalan

28

Saya memiliki program ini yang dapat dijalankan dengan antarmuka pengguna teks dan antarmuka pengguna grafis.

Itu tidak memiliki saklar baris perintah untuk memaksa satu atau yang lain, bukan saya kira itu entah bagaimana otomatis mendeteksi apakah kita berada di X atau tidak (misalnya jika saya menjalankannya dari terminal virtual memasuki mode teks, dan jika saya menjalankannya dari emulator terminal X itu membuka jendela grafis terpisah).

Saya ingin memaksanya ke mode teks dan menjalankannya di dalam terminal X. Bagaimana saya melakukannya?

Luka Aleksić
sumber

Jawaban:

40

Biasanya adil

unset DISPLAY

di baris perintah terminal. Beberapa aplikasi lebih pintar dari itu, dan sebenarnya memeriksa izin dan jenis konsol versus pseudoterminal.

Thomas Dickey
sumber
7
Sayangnya, beberapa perangkat lunak yang benar-benar keras kepala akan menganggap DISPLAY=:0jika tidak disetel. Saya percaya Anda dapat memperbaikinya dengan menjalankannya di bawah pengguna yang berbeda dan menggunakan iptables untuk menjatuhkan loopback X11, tapi itu cukup kotor.
Kevin
2
@ Kevin mungkin DISPLAY=invalid:0?
sourcejedi
2
@PeterCordes atau Anda dapat menjalankan perintah melalui envalih-alih env -u DISPLAY emacs foo.c
subshell
2
@PeterCordes emacsmemang memiliki flag baris perintah untuk menonaktifkan penggunaan X. Ketik saja emacs -nw. Tetapi jika tidak, Anda bisa menggunakan DISPLAY= emacsyang berfungsi juga.
kasperd
2
DISPLAY=0.0.0.0:0gagal seketika tanpa melakukan pencarian server nama.
Poin
31

Jika Anda ingin menonaktifkan X untuk satu perintah, Anda dapat menulis

DISPLAY= ./my_command

Perhatikan ruang kosong yang strategis setelahnya =. Secara umum, Anda dapat mengatur variabel lingkungan untuk suatu proses dengan mengawali perintah Anda dengan urutan <variable>=<value>dipisahkan oleh spasi. Karena ruang berfungsi sebagai pemisah, =segera diikuti oleh ruang yang membersihkan variabel sebelumnya. Kita dapat melihat efek dari awalan ini dengan menggunakan subkulit sebagai perintah dan kemudian mencetak lingkungannya. Ambil contoh:

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

Ini akan dicetak

a b d

Ini menunjukkan bahwa lingkungan subkulit memang berbeda seperti yang dimaksudkan. Perhatikan bahwa substitusi shell terjadi sebelum argumen individu dilewatkan echo, jadi hanya ada satu spasi di antara bdan ddi output, sama seperti jika baris perintah echo a b d(dengan dua spasi).

tobi_s
sumber