Я предполагаю, что fcserver работает демонизированным - т.е. отключается от работающей оболочки, а ваша загрузочная программа - нет.
Что происходит, когда ваш скрипт запускается init, так это то, что он порождает новую оболочку (/bin/sh в вашем случае), запускает загрузку и fcserver в фоновом режиме в этой оболочке,... и затем уничтожает эту оболочку. , который неявно отправляет HUP всем дочерним процессам. Fcserver выживает, потому что он демонизирован, а загрузка — нет.
Вы можете попробовать добавить к вызову загрузки префикс nohup
:
#! /bin/sh
nohup /home/pi/sketchbook/leds/loading/application.linux64/loading &
/usr/local/bin/fcserver &
Я не уверен, доступен ли nohup на вашем Raspberry Pi — мне нечего проверять.
Несколько способов сделать это; вот один из них:
sed -e ':a' -e 's_^\([^:]*\)\\_\1/_;t a'
Объяснение хлебных крошек:
-e
указывает команду редактирования. Здесь есть две такие команды.
:a
определяет метку, которую можно использовать в операторах "goto".
Команда s
заменяет первую обратную косую черту в строке прямой косой чертой, если первая обратная косая черта стоит перед любым двоеточием.
Команда t a
переходит к метке :a
при условии, что замена была успешно выполнена с помощью команды s
. (Условное "перейти")
Использование awk
вместо sed
:
awk -v FS=':' -v OFS=':' '{ gsub(/\\/,"/",$1) } { print }'
Это обрабатывает данные как :
-запись с разделителями и использует gsub()
, чтобы заменить все обратные косые черты прямыми косыми чертами в первом поле. Затем он выводит измененные данные.
Я установил разделитель полей ввода ( FS
) и разделитель полей вывода ( OFS
) на :
, чтобы ввод был разделен двоеточием и чтобы двоеточие позже снова вставлялось, когда происходит вывод.
Если у вас есть текст в переменной оболочки, вы можете сделать это непосредственно в оболочке без использования каких-либо внешних утилит:
a='a\b\c\d:text\text'
b=${a%%:*} # the start of the string ("remove the first : and everything after it from $a")
c=${a#*:} # the end of the string ("remove the first : and everything before it from $a")
a="${b//\\//}:$c"
printf '%s\n' "$a"
Этот фрагмент кода напечатает строку a/b/c/d:text \text
в любой sh
-оболочке, поддерживающей расширение параметра ${parameter//pattern/string}
(расширение стандарта POSIX).
Это более или менее имитирует код awk
.