Я использую для этого unar
; по умолчанию, если архив содержит более одного файла или каталога верхнего -уровня, он создает каталог для хранения извлеченного содержимого, названный в честь архива так, как вы описываете:
unar foo.zip
Вы можете принудительно создать каталог во всех случаях с опцией -d
:
unar -d foo.zip
Кроме того, функция может сделать это с помощьюunzip
:
unzd() {
if [[ $# != 1 ]]; then echo I need a single argument, the name of the archive to extract; return 1; fi
target="${1%.zip}"
unzip "$1" -d "${target##*/}"
}
target=${1%.zip}
Строка
удаляет расширение .zip
, не принимая во внимание ничего другого (, поэтому foo.zip
становится foo
, а ~/foo.zip
становится~/foo
).
${target##*/}
расширение параметра удаляет все до последнего /
, поэтому ~/foo
становится foo
. Это означает, что функция извлекает любой файл .zip
в каталог с его именем в текущем каталоге. Используйте unzip $1 -d "${target}"
, если вы хотите вместо этого распаковать архив в каталог рядом с ним.
cron
довольно прост в использовании, но у него есть некоторые особенности, о которых вам следует знать. Вот краткий обзор:
cron
задания имеют другую СРЕДУ cron
задания выполняются в среде, отличной от вашей интерактивной оболочки . ПУТЬ является частью ОКРУЖАЮЩЕЙ СРЕДЫ. Это может быть причиной вашей проблемы :ПУТЬ к gradle
не может быть в ПУТИ, используемой cron
. Это может вызвать проблемы для любого задания cron
.
Решение :Как правило, это можно решить, указав полный путь для всех команд.
Вместо этого:
0 2 * * * gradle
Используйте это:
0 2 * * * /full/path/to/gradle
cron
не знает о доступности ресурсов cron
не проверяет наличие ресурсов, необходимых для запуска задания, перед попыткой запуска задания. Обычно это происходит при запуске задания cron
во время загрузки (, т. е. с использованием средства @reboot
). Примером такой ситуации является задание, которое запускается во время загрузки и требует доступа к сетевым ресурсам.
Решение :Обычно это решается путем добавления команды sleep X
перед заданием:
@reboot ( /bin/sleep 30; /home/myhome/myprog.sh )
cron
не сообщается cron
не имеет доступа к вашему терминалу, поэтому stderr
переходит к /dev/null
. Если вы хотите видеть ошибки (и вы всегда это делаете! ),вам нужно только перенаправить stderr
в файл -это один из способов сделать это:
0 2 * * * /home/myhome/dosomething.sh > /home/myhome/cronjoblog 2>&1
Это перенаправляет всеstdout
(1 )на /home/myhome/cronjoblog
и перенаправляетstderr
(2 )наstdout
(2>&1 ). Весь вывод идет в ваш файл cronjoblog
.