небольшой скрипт может решить литерал #include
,
не рекурсивно, включение самого файла может вызвать бесконечный цикл
и рекурсивное включение не указано как обязательное.
В конечном итоге может понадобиться настоящий синтаксический анализатор, и вы можете обратиться к другим ответам.
передать main.txt
следующему Perl-скрипту через стандартный ввод
вывод (примерно )желаемый вывод.
awk тоже может сделать эту работу, но мне нравится тайна perl:)
#!/usr/bin/perl
while (<>) {
if (/^#include (.*)/) {
system('cat',$1);
} else {
print;
}
}
Укороченная версия приведенного выше кода с одним -вкладышем:
perl -e '(/^#include (.*)/ ? system("cat",$1) : print) while <>;' <main.txt
Для тех, кому интересно узнать больше о Perl:
<>
— это сокращение от STDIN
, которое является стандартным входным потоком
Ключевое слово while
может быть помещено в конце строки; и ()
можно опустить, если нет двусмысленной интерпретации.
Для каждой строки, прочитанной из STDIN
, Perl сохраняет ее в$_
$_
— это предопределенная переменная, которую большинство Perl встроенных -функций принимает в качестве аргумента, если аргумент не задан,
print
— одна из встроенных -функций, которая принимает$_
После прочтения каждой строки perl будет вычислять троичное выражение. Соответствие регулярному выражению применяется к $_
по умолчанию
Когда /^#include (.*)/
возвращает 1 (число обнаруженных совпадений ), указывает, что $_
начинается с литерала#include
perl хранит оставшуюся часть от $_
до $1
,так как это 1-й сгруппированный захват ($2,$3....определяются, если групп больше)
Функция system
вызывает команду через системную оболочку, в основномsh
в этой строке вызывается cat
и передается $1
в качестве аргумента.
Когда /^#include (.*)/
возвращает 0 на $_
, print
оценивается и в качестве побочного эффекта выводит$_
Значение троичного выражения молча игнорируется
Ах, статический -сетевой -сервис был пример, который помог мне понять:
service
перед bluetooth-service
. Я не очень понимаю, почему, наверное, потому что service
преобразует что-то еще в сервис, а bluetooth-service
уже является сервисом сам по себе. #:
можно просто скопировать дословно. Кажется, пока это работает:
(services
(append
(list (service gnome-desktop-service-type)
(bluetooth-service #:auto-enable? #t)
%desktop-services))
По крайней мере, перенастройка работает, так что теперь, надеюсь, можно будет запустить bluetooth.
Редактировать 1 :Успех!
herd status
показывает, что Bluetooth работает, но Bluetooth еще не работает. Я в группе lp
и перезагрузился. При входе в gnome появляется всплывающее окно с этим сообщением об ошибке:
Failed to apply network settings
You might not be able to connect to the Bluetooth network via this machine
Exception
g-dbus-error-quark: GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name org.blueman.Mechanism was not provided by any.service files (2)
Редактировать 2 :Успехов больше!
blueman-manager
смог найти гарнитуру и выполнить сопряжение с ней. Но GNOME почему-то вообще не мог найти bluetooth-адаптер. Тем не менее, я мог перенаправить звук на гарнитуру, используя обычные настройки звука GNOME.
К сожалению, настроить громкость невозможно.Ни регулятор громкости GNOME, ни «аппаратный» регулятор громкости на гарнитуре нельзя использовать для уменьшения громкости. Только регуляторы громкости в самом игровом приложении (, например. youtube )уменьшит громкость.
Я не уверен, что остальные проблемы связаны с GUIX.
Это может быть просто указатель, но знак решетки указывает на ключевое слово lisp и может использоваться как в других языках (на ум приходит python ). Документацию можно найти по адресу https://www.gnu.org/software/guile/manual/guile.html#Keywords.
Кроме того, я заметил пакет bluetooth gnome -, который может представлять интерес, хотя я сам не запускаю gnome, поэтому не могу подтвердить, что он решит вашу проблему(https://guix.gnu.org/packages/gnome-bluetooth-3.34.2/).