Вам не нужен $()
оператор в sudo sh -c ...
командах.
При использовании этого оператора для sed '$a\' $ > $.bak
then sed
и перенаправления в файл >
команды сначала выполняются с правами пользователя b, которых недостаточно для записи. И только после этого sudo sh -c
выполняется вывод предыдущих команд.
Используй sudo sh -c "sed ..."
и sudo sh -c "echo ..."
вместо.