X: alt / ctrl / f1 больше не работает после выключения и повторного включения дисплея с помощью xrandr

In

ls $(grep file file.txt)

Вы неправильно используете оператор split+glob, и именно в этом кроется ваша проблема. Вы не хотите вставлять кавычки в вывод grep, поскольку этот вывод не интерпретируется как shell-код (к счастью!), но вам нужно настроить свой оператор split+glob.

Здесь

  1. Вам не нужна часть glob (расширение слов *, например, в список файлов в текущем каталоге), поэтому вам нужно отключить ее с помощью:

    set -o noglob
    
  2. Вы хотите разделить вывод grep только по символам новой строки (это по-прежнему означает, что имена ваших файлов не могут содержать символов новой строки, но это ограничение формата вашего file.txt файла) с помощью:

    IFS='
    '
    

    or

    IFS=$'\n'
    

    в некоторых оболочках.

И тогда вы можете вызвать свой оператор split+glob (оставив $(...) без кавычек), но скорее:

ls -d -- $(grep file files.txt)

Этот оператор split+glob - ошибка, унаследованная от оболочки Bourne. В современных оболочках есть другие способы разделить некоторый текст на список его строк.

В zsh:

ls -d -- ${(f)"$(grep file files.txt)"}

The, f флаг расширения параметров для разбиения на newline (linefeed), сокращенно ps:\n:' (s:string: используется для разбиения на произвольные строки, p для понимания управляющих последовательностей типа \n в этой строке). Мы цитируем $(...) для отключения оператора split+glob, хотя в случае zsh есть только часть split (без glob).

С bash:

readarray -t files < <(grep file files.txt)
ls -d -- "${files[@]}"

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

Так что вы можете сделать:

 sed '
   s/"/"\\""/; # escape the " characters themselves
   s/^/"/;s/$/"/; # insert one at the beginning and one at the end
 ' < files.txt | xargs ls -d --
3
09.12.2016, 14:41
1 ответ

Это расширенный комментарий, а не ответ.

В моей системе, в которой Ctrl + Alt + F1 работает правильно, я получаю событие KeyPress для элемента управления и alt , но не для F1 . Хотя я знаю, что это работает, так как меня перевели на tty1.

Это полный вывод xev в моем случае (для сравнения):

root@debi64:/home/gv/Desktop/PythonTests# xev -event keyboard
Outer window is 0x4400001, inner window is 0x4400002

KeymapNotify event, serial 18, synthetic NO, window 0x0,
    keys:  4294967192 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   
           0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   

KeyPress event, serial 25, synthetic NO, window 0x4400001,
    root 0x281, subw 0x0, time 11550957, (157,186), root:(748,462),
    state 0x0, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyPress event, serial 28, synthetic NO, window 0x4400001,
    root 0x281, subw 0x0, time 11550960, (157,186), root:(748,462),
    state 0x8, keycode 37 (keysym 0xffe3, Control_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 28, synthetic NO, window 0x4400001,
    root 0x281, subw 0x0, time 11553775, (157,186), root:(748,462),
    state 0xc, keycode 67 (keysym 0x1008fe01, XF86Switch_VT_1), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 28, synthetic NO, window 0x4400001,
    root 0x281, subw 0x0, time 11553902, (157,186), root:(748,462),
    state 0xc, keycode 37 (keysym 0xffe3, Control_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 28, synthetic NO, window 0x4400001,
    root 0x281, subw 0x0, time 11553902, (157,186), root:(748,462),
    state 0x8, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeymapNotify event, serial 28, synthetic NO, window 0x0,
    keys:  4294967169 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   
           0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   

ClientMessage event, serial 28, synthetic YES, window 0x4400001,
    message_type 0x11b (WM_PROTOCOLS), format 32, message 0x119 (WM_DELETE_WINDOW)

Я также создал небольшой скрипт на Python, который имитирует Ctrl + alt + F1 нажатие клавиши. Когда я запускаю скрипт, меня тоже без проблем переводят в tty1.

Вы даже можете попробовать запустить этот скрипт на своем компьютере, чтобы проверить, заходите вы на tty1 или нет, в качестве двойной проверки / подтверждения того, что ваша клавиатура работает нормально:

https://github.com/gevasiliou/PythonTests /blob/master/pykey-test.py

PS: Вместо скрипта вы также можете попробовать запустить #chvt 1 , который также должен перевести вас на tty1.

После некоторых исследований другие пользователи сообщили, что клавиши Ctrl + alt + fn перестали работать из-за обновлений xserver (очевидно), которые изменил некоторые настройки разрешения, которые применяются в tty.

Например, в этом посте проблема была решена путем применения определенного разрешения vga во время загрузки в качестве параметра ядра (vga = mode), например vga = 0x0362. Очевидно, одно из этих обновлений системы испортило разрешение у этих ребят, так что, возможно, это также ваш случай (и только бог знает почему).

PS: Чтобы увидеть доступные для вашей системы режимы, вам необходимо запустить hwinfo --framebuffer | grep 'Mode' и выбрать режим из перечисленных.

Кстати, вы включили некоторую часть xev с F3 в свой вопрос, но каков результат с F1 ?

ОБНОВЛЕНИЕ:
Как для дальнейшего устранения неполадок можно попробовать следующее:

  1. Глядя на исходный код xrandr , кажется, что опция --off выполняет следующие команды:

     set_name_xid (& config_output-> mode, None ); 
    set_name_xid (& config_output-> crtc, None); 
    config_output-> changes | = changes_mode | changes_crtc; 
     

Вы можете попробовать повторно включить --output, указав --mode и --crtc xrandr параметры вместо --auto (на всякий случай, если xrandr "автоматизация" работает некорректно).

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

Это распечатка моей системы, в которой переключение на tty1-2-3-4-5-6 работает нормально:

root@debi64:/home/gv/Desktop/PythonTests# for f in $(find /sys/class/vtconsole/vtcon0/ -type f);do echo -e "File : $f \c\c\c";echo -e "-VALUE : \c";cat $f;done
File : /sys/class/vtconsole/vtcon0/bind -VALUE : 0
File : /sys/class/vtconsole/vtcon0/power/runtime_active_kids -VALUE : 0
File : /sys/class/vtconsole/vtcon0/power/runtime_suspended_time -VALUE : 0
File : /sys/class/vtconsole/vtcon0/power/autosuspend_delay_ms -VALUE : cat: /sys/class/vtconsole/vtcon0/power/autosuspend_delay_ms: Input/output error
File : /sys/class/vtconsole/vtcon0/power/runtime_enabled -VALUE : disabled
File : /sys/class/vtconsole/vtcon0/power/runtime_active_time -VALUE : 0
File : /sys/class/vtconsole/vtcon0/power/control -VALUE : auto
File : /sys/class/vtconsole/vtcon0/power/async -VALUE : disabled
File : /sys/class/vtconsole/vtcon0/power/runtime_usage -VALUE : 0
File : /sys/class/vtconsole/vtcon0/power/runtime_status -VALUE : unsupported
File : /sys/class/vtconsole/vtcon0/uevent -VALUE : 
File : /sys/class/vtconsole/vtcon0/name -VALUE : (S) VGA+
root@debi64:/home/gv/Desktop/PythonTests# for f in $(find /sys/class/vtconsole/vtcon1/ -type f);do echo -e "File : $f \c\c\c";echo -e "-VALUE : \c";cat $f;done
File : /sys/class/vtconsole/vtcon1/bind -VALUE : 1
File : /sys/class/vtconsole/vtcon1/power/runtime_active_kids -VALUE : 0
File : /sys/class/vtconsole/vtcon1/power/runtime_suspended_time -VALUE : 0
File : /sys/class/vtconsole/vtcon1/power/autosuspend_delay_ms -VALUE : cat: /sys/class/vtconsole/vtcon1/power/autosuspend_delay_ms: Input/output error
File : /sys/class/vtconsole/vtcon1/power/runtime_enabled -VALUE : disabled
File : /sys/class/vtconsole/vtcon1/power/runtime_active_time -VALUE : 0
File : /sys/class/vtconsole/vtcon1/power/control -VALUE : auto
File : /sys/class/vtconsole/vtcon1/power/async -VALUE : disabled
File : /sys/class/vtconsole/vtcon1/power/runtime_usage -VALUE : 0
File : /sys/class/vtconsole/vtcon1/power/runtime_status -VALUE : unsupported
File : /sys/class/vtconsole/vtcon1/uevent -VALUE : 
File : /sys/class/vtconsole/vtcon1/name -VALUE : (M) frame buffer device
  1. Наконец, может быть полезно изучить возможные функции автоматического энергосбережения, такие как Xserver DPMS , которые могут автоматически активироваться при длительном бездействии.

Второе обновление:

Осмотревшись, я обнаружил, что DPMS и другие полезные настройки, связанные с энергосбережением на виртуальных терминалах, можно контролировать с помощью команды setterm . В случае, если ваши виртуальные терминалы кажется, что они спят, вы можете попытаться разбудить их (если это так), отправив им команду setterm --reset . Чтобы отправить команду со своего обычного tty7 на другой tty, вам необходимо использовать: setsid bash -c 'exec setterm --reset <> / dev / tty1> & 0 2> & 1 '
Единственная проблема в том, что вы должны войти в систему на tty1.

Для тестирования вы можете использовать setsid bash -c 'exec setterm --reverse on <> / dev / tty1> & 0 2> & 1' и пока ваш tty1 работает, если вы переключитесь на него с помощью chvt 1 , вы можете наблюдать результаты (обратное переключение цветов в терминале - проверено и работает в Debian).

Кроме того, setterm дает вам возможность включить / отключить энергосбережение с помощью setterm --powersave off и многих других (см. man setterm )

1
27.01.2020, 21:30

Теги

Похожие вопросы