In
ls $(grep file file.txt)
Вы неправильно используете оператор split+glob, и именно в этом кроется ваша проблема. Вы не хотите вставлять кавычки в вывод grep
, поскольку этот вывод не интерпретируется как shell-код (к счастью!), но вам нужно настроить свой оператор split+glob.
Здесь
Вам не нужна часть glob (расширение слов *
, например, в список файлов в текущем каталоге), поэтому вам нужно отключить ее с помощью:
set -o noglob
Вы хотите разделить вывод 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 --
Это расширенный комментарий, а не ответ.
В моей системе, в которой 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 ?
ОБНОВЛЕНИЕ:
Как для дальнейшего устранения неполадок можно попробовать следующее:
Глядя на исходный код 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 "автоматизация" работает некорректно).
/ 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
Второе обновление:
Осмотревшись, я обнаружил, что 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
)