Использование {}
в строчном скрипте -, выполняемом через find
, является уязвимостью, связанной с внедрением кода. Не делай этого. Первый аргументsh -c
(сценария )должен быть заключен в одинарные кавычки, а аргументы этого сценария должны передаваться в его командной строке.
Вместо этого напишите команду find
примерно так: (использует bash
вместо sh
, чтобы иметь возможность использовать ${parameter//pattern/word}
в одном месте):
find stdlib/main -type f -exec bash -c '
for pathname do
string=${pathname#stdlib/main/} # delete initial path
string=${string%.*} # delete suffix after last dot
string=${string////.} # change slashes to dots
# output:
printf "resource:\"%s,%s\"\n" "$pathname" "$string"
done' bash {} +
Вместо использования sed
используется подстановка параметров для изменения имен путей, найденных с помощью find
. Скрипт в строке -bash
будет выполняться для пакетов найденных файлов и будет перебирать пути в каждом пакете. printf
выведет данные, преобразованные так же, как ваша команда sed
(, если мне удастся правильно их расшифровать, это не просто то, что вы описали ).
То, как вы впоследствии справляетесь с именами файлов, содержащими двойные кавычки и запятые, — это другой вопрос. (вывод строки после resource:
может оказаться трудным для синтаксического анализа ).
Проще всего было бы поместить команду find
в отдельный скрипт и вызывать ее из GNU make
в $(shell...)
, иначе получится что-то вроде
STDLIB_RESOURCES := $(shell \
find stdlib/main -type f -exec bash -c ' \
for p do \
s=$${p\#stdlib/main/}; \
s=$${s%.*}; \
s=$${s////.}; \
printf "resource:\"%s,%s\"\n" "$$p" "$$s"; \
done' bash {} + )
в вашем Makefile (из-за того, как GNU make
обрабатывает переменные и т. д. )Также обратите внимание на :=
. Это нужно для того, чтобы команда выполнялась сразу после присвоения переменной,не каждый раз при доступе к переменной.
Связанные:
Для этого есть другой обходной путь. У меня было такое же поведение в xfreerdp. Я нашел решение на Reddit:
https://www.reddit.com/r/archlinux/comments/elp2lf/cant_grab_input_in_fullscreen_apps_like_vms/
Я запускаю в своем терминале следующее:
settings set org.gnome.mutter.wayland xwayland-grab-access-rules "['xfreerdp']"
Теперь ключи работают, и я могу продолжать пользоваться Wayland.
Это был долгий путь, но я решил, что должен попробовать.
GNOME использует Wayland в качестве сервера отображения по умолчанию. Но был шанс, что это было основной причиной моих проблем, (это было, читайте дальше ).
Итак, я решил перенастроить свой GNOME для использования Xorg в качестве сервера отображения, основываясь на этой статье Fedora -. Шаги следующие:
/etc/gdm/custom.conf
и раскомментируйте WaylandEnable=false
. [daemon]
:DefaultSession=gnome-xorg.desktop
custom.conf
. После перезапуска сеанса GNOME режим «Захват всех событий клавиатуры» работает как чудо.
С 20.04 и упакованной версией Remmina все работает нормально, несмотря на использование Wayland.