Скажем, у меня есть базовый скрипт оболочки foo.sh:
#!/bin/sh
while [ 1 ]
do
echo "looping"
sleep 1
done
И я хочу, чтобы это было предложено в качестве команды: /snap/bin/myapp.foo
У меня есть snapcraft.yaml :
apps:
foo:
command: opt/foo/bin/foo.sh
parts:
foo:
source: .
plugin: dump
organize:
foo.sh: opt/foo/bin/foo.sh
В результате получается файл /snap/bin/myapp.foo
, но это ссылка на / usr / bin / snap. Я получаю ошибку сегментации при запуске команды.
Как правильно настроить snapcraft.yaml для этого? Мне интересно, если я должен упаковать sh
в Snap? Или, если сценарии оболочки не предназначены для использования в моментальных снимках?
Хорошо, поэтому две вещи отсутствовали.
1) В разделе команд следует использовать переменную среды $ SNAP. Все созданные вами части будут сохранены относительно этой переменной env во время выполнения.
2) Вместо непосредственного вызова сценария оболочки укажите интерпретатор (в данном случае «sh»). Без этого не получилось.
apps:
foo:
command: sh $SNAP/opt/foo/bin/foo.sh
parts:
foo:
source: .
plugin: dump
organize:
foo.sh: opt/foo/bin/foo.sh
ДОБАВЛЕНИЕ 1: Оказалось, что действительно важным фактором для меня было то, что в Ubuntu 18 Snap привязан к версии libc, которая есть в Ubuntu 16. Это приводит к тому, что Snap необходимо всасывать libc6 в Ubuntu 18 в мой Snap, что, в свою очередь, создает конфликты с такими вещами, как bash и dash / sh.
Если вы пытаетесь запустить сценарии оболочки и видите ошибки, это, вероятно, связано с этим. Процесс пытается вызвать сценарий оболочки, читает «shebang» сверху («#! / Bin / bash»), и когда он запускает / bin / bash, он получает конфликт libc.
ДОБАВЛЕНИЕ 2: В ситуациях, когда родительский процесс запускает сценарии оболочки, будьте осторожны, так как утверждение «shebang» вверху, вероятно, будет недопустимым. Например, «#! / Bin / sh» не будет разрешен правильно, потому что фактический путь будет «$ SNAP / bin / sh», что приведет к чему-то вроде «/ snap / имя-проекта / project-revision / bin / sh» ».
Чтобы обойти это, убедитесь, что среда PATH передается в программу с префиксом $ SNAP для каждого соответствующего пути. Затем настройте родительскую программу так, чтобы она вызывала скрипт с помощью интерпретатора, например, «bash child.sh» против «child.sh».