Хм... эта замена Vi не работает ни в одном редакторе Vi, в котором я пробовал. Вы, вероятно, имели в виду :%s/\\\n/ /g
, который будет работать в Vim, но не в Vi.
$ sed '/\\$/{N;s/\\\n/ /;}' file
line 1 line 2
line 3
line 4 line 5
Определяет, заканчивается ли текущая строка обратной косой чертой, и если да, то добавляет следующую строку.(sed
добавляет между ними символ новой строки ), заменяет обратную косую черту и новую строку символом пробела.
Это не удастся, если в конце двух последовательных строк есть обратная косая черта. Для этого используйте что-то вроде
sed ':top;/\\$/{N;s/\\\n/ /;btop;}' file
Здесь, если была обработана строка с обратной косой чертой, код возвращается к началу.
Аннотированная версия последнего sed
сценария:
:top; # define label "top"
/\\$/{ # the line ends with backslash
N; # append next line to pattern space with embedded newline
s/\\\n/ /; # substitute backslash and newline with space
btop; # branch to "top"
}
# (implicit print)
Одна из проблем с запуском двоичных файлов в системе Guix заключается в том, что они не знают о фактическом расположении библиотек. Они хотят использовать глобально -установленные библиотеки, но guix установил их только в магазине. Есть два решения :создать среду, в которой двоичный файл может найти библиотеки, или исправить двоичный файл, чтобы найти библиотеки.
Для обоих решений необходимо знать, какие библиотеки вам понадобятся. Попробуйте это(ldd
из пакета glibc
):
$ ldd my-binary
linux-vdso.so.1 (0x00007ffe80da9000)
libdl.so.2 => not found
libc.so.6 => /gnu/store/fa6wj5bxkj5ll1d7292a70knmyl7a0cr-glibc-2.31/lib/libc.so.6 (0x00007f7651b77000)
/gnu/store/fa6wj5bxkj5ll1d7292a70knmyl7a0cr-glibc-2.31/lib/ld-linux-x86-64.so.2 (0x00007f7651d3b000)
Теперь вы знаете, какие файлы библиотек необходимы. Отметьте их и найдите пакеты, которые нужны, помимо glibc
, для запуска пакета.
Первое решение требует от вас создания контейнера, в котором вы предоставляете доступ к библиотекам и двоичным файлам в глобальном расположении. Обратите внимание, как мы используем -s i686-linux
для создания среды для этой архитектуры вместо среды по умолчанию.
PROFILE=$(guix environment -C -N --ad-hoc glibc... -s i686-linux -- bash -c 'echo $GUIX_ENVIRONMENT')
guix environment -C -N --ad-hoc glibc... -s i686-linux --expose=$PROFILE/lib=/lib --expose=$PROFILE/lib=/lib64
Первая строка создает переменную PROFILE
, содержащую путь к профилю, который мы создаем для среды. Он запускает команду echo и сразу же существует. Использование одинарных кавычек необходимо, так как не нужно, чтобы bash из вне среды расширял переменную. Вторая команда фактически позволяет вам войти в среду. Если программе требуется графический дисплей, вам нужно будет поделиться/раскрыть больше вещей.
Второе решение состоит в том, чтобы исправить двоичный файл, что позволит вам запускать его в вашей обычной среде, что означает, например, меньше проблем с доступом к графическому интерфейсу, аудио или другому оборудованию.Для этого используется patchelf, и есть два способа сделать это :ручной способ (быстрый и грязный )или способ упаковки.
Быстрый и грязный способ — построить каждую зависимость, которую вы отметили ранее, вот так (для glibc):
$ guix build glibc -s i686-linux
/gnu/store/9728x9zhj8d3zlyzsjpz342jpccrgkgd-glibc-2.31
Это дает вам путь к магазину и гарантирует наличие библиотеки в вашем магазине.
Теперь с patchelf (из пакета patchelf
):
patchelf --set-interpreter /gnu/store/...-glibc-.../lib/ld-linux.so.2
patchelf --set-rpath /gnu/store/...-glibc-.../lib:/gnu/store/.../lib:/gnu/store/.../lib:...
это устанавливает интерпретатор на ld -linux.so.2 (для 32 бит )и rpath, который является путем поиска динамических библиотек. Это должен быть разделенный двоеточием -список каталогов, в которых расположены требуемые библиотеки.
Этот метод относительно быстрый, но грязный, так как он не регистрирует никакого корня gc, и вам придется повторять его снова каждый раз, когда вы обновляете guix или запускаете сборщик мусора.
Последняя возможность — создать определение пакета для вашего двоичного файла, в котором будет зарегистрирована информация о зависимостях, и вы также можете использовать этот метод для установки двоичного файла в свой профиль. Вы можете использовать binary-build-system
в nonguix:https://gitlab.com/nonguix/nonguix
Недостатком этого метода является то, что он копирует двоичный файл в хранилище, а двоичный файл может быть большим. Но использование определения пакета более -оправдано в будущем, так как вы всегда можете собрать его снова и обновить пакет. Система бинарной сборки, по сути, выполняет приведенные выше команды patchelf за вас более декларативным способом. Вы можете определить пакет таким образом:
(package
(name "my-binary")
(version "version")
(source (local-file "/home/..."))
(build-system binary-build-system)
(arguments
`(#:patchelf-plan
`(("my-binary" ("libc" "gcc:lib"...)))
#:install-plan
`(("my-binary" "bin/"))))
(inputs
`(("gcc:lib",gcc "lib")))); note how the first string must match the one in
; patchelf-plan. libc is already implicitely defined
Затем вы можете собрать этот пакет с чем-то вроде:
guix build -s i686-linux -f my-package.scm