Shell-скрипт для загрузки и распакуйте архив с GitHub


Я ничего не хочу выполнять, если любой предыдущий шаг завершается ошибкой:

#!/bin/sh

file="v0.9"
renamed=$file".tar.gz"
dir="utils/external/firepython/"
location="https://github.com/darwin/firepython/tarball/$file"

wget --no-check-certificate $location --output-document=$renamed && \
mkdir -p $dir && \
gunzip $renamed && \
echo "extracting to $dir" && \
tar xf $file".tar" --directory $dir --strip-components 1 && \
echo "Cleaning up..." && \
rm -r $file".tar" && \
echo "Done"


1020
6
задан 10 апреля 2011 в 05:04 Источник Поделиться
Комментарии
3 ответа

Вы ищете набор -электронная. Из стандарта POSIX:



Когда эта опция включена, если простая команда терпит неудачу по любой из причин, перечисленных в Последствия Shell ошибки или возвращает статус выхода значение >0, и не является частью составного списка ниже, пока, или если сайта, а не частью и или или список, и это не газопровод предшествует ! зарезервированное слово, тогда оболочка немедленно покинуть.

Иными словами, простые команды оболочки, если они терпят неудачу. (Вы можете использовать что-то вроде команды || правда , чтобы привести команду , чтобы возвратить ненулевое значение.) Если вам нужно выполнить какое-то очистку, вы можете установить ловушки для выхода псевдо-сигнала.

И лучше дважды процитировать все ваши переменной разложения. Таким образом, ваш скрипт не будет не ужасно, если вы когда-нибудь указываешь на каталог или URL-адрес, содержащий ? или * или пробел.

dry -r
wget --no-check-certificate "$location" --output-document="$renamed"
mkdir -p "$dir"
gunzip "$renamed"
echo "extracting to $dir"
tar xf "$file.tar" --directory "$dir" --strip-components 1
echo "Cleaning up..."
rm -r "$file.tar"
echo "Done"


Еще одна полезная идиома оболочки для передачи дополнительных аргументов в скрипт без хлопот-это набор переменных, только если они неопределенные. Таким образом, вы можете передавать аргументы через среду, например файл=версии v0.9.1 мой_сценарий.

: "${file=v0.9}"
: "${renamed=$file.tar.gz}"
: "${dir=utils/external/firepython/}"
: "${location=https://github.com/darwin/firepython/tarball/$file}"

14
ответ дан 10 апреля 2011 в 06:04 Источник Поделиться

@Жиль ответ по поводу набора -е - это прямо в цель. Альтернативный способ, если только одна или две команды в скрипте являются маст-хэвом, вы можете использовать главное-команда || выход из как способ, чтобы выйти из сценария, если ни одна команда не выполняется.

Я часто включать вспомогательные функции в моем сценарии под названием 'завалить', который обрабатывает какие-либо очистки, что должно быть сделано, если что-то не удается. Это может выглядеть примерно так:

function flunk () {
echo "SCRIPT FAILED: $1"
rm $TMPFILES
exit 1
}

command
important-command || flunk "Could not do X"
command

7
ответ дан 11 апреля 2011 в 12:04 Источник Поделиться

Вы, вероятно, можете использовать трубы вместо создание и удаление загруженного файла:

mkdir -p "$dir"
echo "extracting to $dir"
wget --no-check-certificate "$location" --output-document=- |
tar zxvf - --strip-components 1 --directory="$dir"
echo "Done"

6
ответ дан 12 апреля 2011 в 04:04 Источник Поделиться