Один распространенный способ:
die() {
IFS=' ' # make sure "$*" is joined with spaces
# output the arguments if any on stderr:
[ "$#" -eq 0 ] || printf '%s\n' "$*" 1>&2
exit 1
}
затем Вы используете его как это:
mkdir -p some/path || die "mkdir failed with status $?"
Или если Вы хотите, чтобы это включало статус выхода, Вы могли бы изменить его на:
die() {
last_exit_status=$?
IFS=' '
printf '%s\n' "FATAL ERROR: $* (status $last_exit_status)" 1>&2
exit 1
}
и затем использование его немного легче:
mkdir -p some/path || die "mkdir failed"
Когда это перестало работать, mkdir
вероятно, уже выпустит сообщение об ошибке, так, чтобы второй мог рассматриваться как избыточный, и Вы могли просто сделать:
mkdir -p some/path || exit # with the same (failing) exit status as mkdir's
mkdir -p some/path || exit 1 # with exit status 1 always
(или используйте первый вариант die
выше без аргумента)
На всякий случай Вы не видели command1 || command2
прежде, это работает command1
, и если command1
сбои, это работает command2
.
Таким образом, можно читать, это как "делает каталог или умирает".
Ваш пример был бы похож:
mkdir -p some/path || die "mkdir failed"
cd some/path || die "cd failed"
some_command || die "some_command failed"
Или можно выровняться dies
далее справа так, чтобы основной код более очевиден.
mkdir -p some/path || die "mkdir failed"
cd some/path || die "cd failed"
some_command || die "some_command failed"
Или на следующей строке, когда командные строки долги:
mkdir -p some/path ||
die "mkdir failed"
cd some/path ||
die "cd failed"
some_command ||
die "some_command failed"
Кроме того, если Вы собираетесь использовать имя some/path
многократно, сохраните его в переменной, таким образом, Вы не должны продолжать вводить его и можете легко изменить его, если Вы должны. И при передаче аргументов переменной командам, удостоверьтесь, что использовали --
разделитель опции так, чтобы аргумент не был взят в качестве опции, если это запускается с -
.
dir=some/path
mkdir -p -- "$dir" || die "Cannot make $dir"
cd -P -- "$dir" || die "Cannot cd to $dir"
some_command || die "Cannot run some_command"
Создайте файл со следующим содержанием (например. list_packages.sh
):
#!/bin/bash
dpkg -l > ~/Dropbox/installed_packages
Поместите этот файл в /etc/cron.weekly/
и это будет работать один раз в неделю.
Сохраните это как сценарий, скажите installed_packages_list.sh
:
#!/bin/bash
dpkg -l > ~/Dropbox/installed_packages
Сделайте это исполняемым файлом.
chmod u+x installed_packages_list.sh
Затем выполненный
crontab -e
Это откроет файл в текстовом редакторе. Введите это и сохраните
@weekly /full/path/to/script
Сценарий будет выполняться один раз в неделю с полномочиями пользователя, который запланировал задание крона.
Во-первых, для того, чтобы сделать это Вы не должны выполнять задание как суперпользователь.
Самый легкий способ решить это состоит в том, чтобы отредактировать crontab Вашего обычного пользователя через
crontab -e
В зависимости от Вас переменная среды РЕДАКТОРА пользователи crontab открыты с Вашим любимым текстовым редактором.
Там можно добавить что-то как
# m h dom mon dow command
5 12 * * 1 bash $HOME/pkg.backup.sh
Необходимо затем создать pkg.backup.sh файл с командой dpkg в нем.
Btw, если Вы хотите смочь легко восстановить свое текущее состояние пакета машины (иначе выбор пакета), затем эта командная строка, более ориентирован на цель:
dpkg --get-selections > foo
Для восстановления его просто необходимо ввести
dpkg --set-seclections < foo
На самом деле dpkg-l полезен в дополнение к этому, если Вы хотите зарегистрировать точное число версии пакета, также.