Оболочка install.sh для репозитория (rpi_videoloop)


Я написал свой первый скрипт установки в оболочки и было интересно, как я могу улучшить процедуру установки, чтобы сделать его более чистым?

Вот код:

#!/bin/bash

#Variables
DEPENDENCIES="omxplayer screen cron usbmount ntfs-3g"
PTH="/home/pi/rpi_videoloop"
INIT="/etc/init.d"
SCRIPT="videoloop_v2.sh"
CONTROLLER="vid_controller"
USBCONF="usbmount.conf"
CRONSTUFF=$(cat cron.txt)

# Checking | Installing Dependancies
if ! apt list "$DEPENDENCIES" | grep -v installed | grep -E 'omxplayer|screen|cron|usbmount|ntfs-3g' > /dev/null
then
echo "Dependencies already installed. Continuing."
else
echo "Installing dependencies."
apt-get update
apt-get install "$DEPENDENCIES" -y
fi

echo "Installing Configurations..."

#Configuring
if [ ! -d "$PTH" ]; then 
    mkdir $PTH
fi
cp $SCRIPT $PTH
if [ ! -f $INIT/$CONTROLLER ]; then
    sudo cp $CONTROLLER $INIT
fi
cp $USBCONF /etc/usbmount/
sudo chmod 755 $PTH/$SCRIPT
sudo chmod 755 $INIT/$CONTROLLER
sudo update-rc.d $CONTROLLER defaults
sudo echo -n " consoleblank=10" | sudo tee -a /boot/cmdline.txt
#cat alias.txt >> ~/.bashrc
#sudo cat alias.txt >> ~/.bashrc
(crontab -u pi -l; echo "$CRONSTUFF" ) | crontab -u pi -

echo "FINISHED INSTALLATION: Service control -> /etc/init.d/vid_controller {start|stop|check|repair}"


104
2
задан 23 марта 2018 в 10:03 Источник Поделиться
Комментарии
3 ответа

Бессмысленно sudo

Если каких-то зависимостей не хватает, скрипт устанавливает их, используя apt-get installбез sudo. Это означает, что скрипт будет работать, как rootиначе она бы не работала. В этом случае все sudo являются ненужными.

Было бы неплохо добавить проверку в начале скрипта, если он выполняется как rootи если это не так, то предупредить пользователя и выход с ошибкой.

Если скрипт действительно не работает как root,
затем я рекомендую сделать это так,
запустив ее с sudo script.

Такой обман становится ненужным:


sudo echo -n " consoleblank=10" | sudo tee -a /boot/cmdline.txt

Вы можете просто написать:

echo " consoleblank=10" >> /boot/cmdline.txt

Я не уверен, почему вы использовали echo -n.
Это хорошая практика, чтобы избежать всех флагов echo,
потому что они не портативные.
Если это действительно важно, чтобы обирать пустую строку,
затем рассмотреть вопрос об использовании printfвместо этого
если вы не возражаете, что это не POSIX-совместимой.

Проверка если пакет установлен или нет

Моя версия man apt показывает, что list суб-команды "(работа в процессе)". И если я выполнять никакие команды на него, например apt list | grep -q .на экран выводится предупреждение:


WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

Как таковой это не хорошая идея, чтобы использовать в скриптах.
Возможно, ваша версия новее.
Для максимальной надежности
Я бы предпочел использовать более стабильные методы,
например dpkg -s.
Один нюанс заключается в том, что просмотрев несколько пакетов не является тривиальным,
так что лучше проверять их в цикле.
Если ни один пакет не найден, то вы можете лениво упасть обратно apt-get install "$DEPENDENCIES" -y.

Всегда двойные кавычки переменные, используемые в параметры команды

Это почти правильно:


if [ ! -d "$PTH" ]; then 
mkdir $PTH
fi

В if условие правильно двойные кавычки $PTH,
но потом mkdir команда не будет.
Даже если вы знаете, что некоторые пути никогда не будет содержать небезопасные символы,
это хорошо всегда двойные кавычки, чтобы построить хорошие привычки.

Этот комментарий относится и ко многим другим местам в сценарии.

1
ответ дан 7 июля 2018 в 02:07 Источник Поделиться

Ваш расклад должен быть #!/bin/sh Если вы пишете переносимый shell-скрипт. Если нет, то читайте этот раздел man bash:


Команда подстановки $(cat file) могут быть заменены на эквивалентные, но быстрее $(< file).

Не повторяйте себе: grep -E 'omxplayer|screen|cron|usbmount|ntfs-3g' могут быть переписаны с использованием шаблона подстановки, grep -E "${DEPENDENCIES// /|}". Но это может привести к нежелательному результату, если слова не разделены ровно одним пробелом. Одно средство заключается в определении DEPENDENCIES как массив сначала, потом перевести на собственный выходной:

DEPENDENCIES=(omxplayer screen cron usbmount ntfs-3g)
DEPENDENCIES=${DEPENDENCIES[@]}

Одна потенциальная проблема-если PTH это существующий файл, затем mkdir $PTH потерпел бы неудачу, и cp $SCRIPT $PTH будет перезаписывать файл, вместо того, чтобы поместить копию в директории, которая не могла быть создана. Добавление дополнительного / в конце PTH чтобы указать, что он каталог бы предотвратить эту трагедию (если вам нужен этот файл) от происходящего.

Вам действительно нужно sudo для chmod 755 $PTH/$SCRIPT и echo -n " consoleblank=10"? Кстати, я напишу printf ' consoleblank=10' вместо.

Цитата все, что можно было бы расширить (за исключением тех, что следуют правилу расширения путем) если разбиение может натворить.

1
ответ дан 5 апреля 2018 в 04:04 Источник Поделиться

Установить эти параметры на начало:

set -eu

так что ошибки не рано


Не использовать sudo в скрипте, потому что он может зависнуть, когда он не подключен к терминалу. Возможное исключение: один раз в начале:

if ! test $UID -eq 0
then
test -t 0 && exec sudo "$0" "$@"
# Not a terminal - or exec failed
echo "Insufficient privileges - try sudo $0 $*" >&2
exit 1
fi


Вы, вероятно, хотите использовать стандартный install команду вместо cp и mkdir. Что позволяет задать разрешения для создания цели.


Рассмотрите возможность использования $DESTDIR префикс при указании цели. Это делает его легче для строителей пакета (например, инструмент), чтобы повторно использовать ваш скрипт. Их нужно опустить в зависимости проверяет, так что сепары если вы можете (или, по крайней мере, отключить его, когда $DESTDIR устанавливается).

1
ответ дан 5 апреля 2018 в 06:04 Источник Поделиться