Как заставить программу думать, что X-сервер не запущен

28

У меня есть эта программа, которая может работать как с текстовым пользовательским интерфейсом, так и с графическим пользовательским интерфейсом.

В нем отсутствует какой-либо переключатель командной строки для принудительного ввода одного или другого, скорее, я думаю, он каким-то образом автоматически определяет, находимся ли мы в X или нет (например, если я запускаю его с виртуального терминала, он переходит в текстовый режим, и если я запускаю его из эмулятор терминала X открывает отдельное графическое окно).

Я бы хотел перевести его в текстовый режим и запустить в X-терминале. Как мне это сделать?

Лука Алексич
источник

Ответы:

40

Обычно просто

unset DISPLAY

в командной строке терминала. Некоторые приложения умнее этого и фактически проверяют разрешения и тип консоли по сравнению с псевдотерминалом.

Томас Дики
источник
7
К сожалению, некоторые действительно упрямые программы будут считать, DISPLAY=:0что они не установлены. Я полагаю, что вы можете это исправить, запустив его под другим пользователем и используя iptables для удаления loopback X11, но это довольно грубо.
Кевин
2
@ Кевин может быть DISPLAY=invalid:0?
sourcejedi
2
@PeterCordes или вы можете выполнить команду envвместо подоболочки:env -u DISPLAY emacs foo.c
pabouk
2
@PeterCordes emacsимеет флаг командной строки, чтобы отключить использование X. Просто введите emacs -nw. Но если это не так, вы можете вместо этого использовать DISPLAY= emacs, что также работает.
kasperd
2
DISPLAY=0.0.0.0:0мгновенно завершает работу без поиска сервера имен.
оч
31

Если вы хотите отключить X для одной команды, вы можете написать

DISPLAY= ./my_command

Обратите внимание на стратегический пробел после =. В более общем смысле вы можете установить переменные среды для процесса, поставив перед командой префикс последовательности, <variable>=<value>разделенной пробелами. Поскольку пробел служит разделителем, =сразу после пробела очищается предыдущая переменная. Мы можем посмотреть на эффект этих префиксов, используя в качестве команды subshell и затем печатая его окружение. Взять например:

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

Это напечатает

a b d

Это показывает, что среда подоболочки действительно отличается от запланированной. Обратите внимание, что подстановка оболочки происходит перед передачей отдельных аргументов echo, поэтому между выходными данными bи dв выходных данных есть только один пробел , как если бы командная строка была echo a b d(с двумя пробелами).

tobi_s
источник