Как добавить сценарий оболочки в качестве команды, предлагаемой Snap?

Скажем, у меня есть базовый скрипт оболочки 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? Или, если сценарии оболочки не предназначены для использования в моментальных снимках?

2
задан 19 July 2018 в 18:08

1 ответ

Хорошо, поэтому две вещи отсутствовали.

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».

2
ответ дан 19 July 2018 в 18:08

Другие вопросы по тегам:

Похожие вопросы: