Вся игра файловой системы изменилась значительно, от даже несколько лет назад. Практично говоря, большинство старые рекомендации стали не важными.
Необходимо будет проверить/выполнить более свежие сравнительные тесты, но предпочтительные варианты очень уменьшили.
Почти для каждой мыслимой ситуации я всегда предпочитал бы EXT4. это только говорит сегодня, brtfs мог бы однажды настигнуть EXT4.... просто не в настоящее время. Поэтому я пришел к этому заключению относительно 'старых рекомендаций'
BRTFS: В настоящее время работает хуже, чем EXT4, недостаточно проверки реального мира IMO.
ResierFS: EXT4 имеет B-дерево по умолчанию, он может оптимально индексировать много маленьких файлов.
Reiser4: Удаленный из официального Ядра, хотя действительно имеет востребованные функции. Будущее все еще сомнительно, больше сравнительных тестов/использования должен быть завершен.
XFS: EXT4 теперь имеет степени и динамический inodes, usally соответствует или превышает производительность XFS. Не говоря уже о, EXT4 имеет начальника, восстанавливаются/журналируют. Можно было утверждать, что это - промывка, но затем я все еще пошел бы EXT4, я только хочу измениться от значения по умолчанию, когда у меня есть неопровержимый довод.
JFS упоминания релевантен, если Ваш по сравнению с EXT3, сегодня он действительно не имеет шансы на выигрыш. Я знаю, что сделаю фанатов абсолютно гаек, но это - просто мое мнение. Я скажу, что работаю Системным администратором Linux, и это должно объяснить мое заключение.
Вы можете использовать Bash DRAR , чтобы сделать ваш скрипт Quit Quit, если какая-либо команда возвращает состояние, превышающую нулю, и выполните функцию в выходе.
Что-то вроде:
myfunc() {
echo 'Error raised. Exiting!'
}
trap 'myfunc' ERR
# file does not exist, causing error
ls asd
echo 123
Обратите внимание, что Bash Trap Err
делает неявную набор -O errexit
или и
и не является POSIX.
и err
Shrap ловушка не выполняется, если команда «Неудачная команда» является частью списка команд, сразу после до
или пока
ключевое слово, часть теста, следующего , если
или или
, или если команда возвратный статус Быть перевернутым с использованием ELIF
зарезервированные слова, часть команды, выполняемой в &&
или ||
, или !
.
Взять ваше слово « каждая команда зависит от каждой предыдущей команды. Если какая-либо команда не удалась, весь скрипт должен потерпеть неудачу » буквально, я думаю, вам не нужна какая-либо специальная функция для обработки ошибок.
Все, что вам нужно, это связать ваши команды с помощью оператора &&
и оператора ||
, который выполняет именно то, что вы написали.
Например, эта цепочка разорвется и напечатает «что-то пошло не так», если любая из предыдущих команд сломалась (bash читает слева направо)
cd foo && rm a && cd bar && rm b || echo "something went wrong"
Реальный пример (я создал dir foo, file a, dir bar и file b только для реальной демонстрации):
gv@debian:/home/gv/Desktop/PythonTests$ cd foo && rm a && cd bar && rm bb || echo "something is wrong"
rm: cannot remove 'bb': No such file or directory
something is wrong #mind the error in the last command
gv@debian:/home/gv/Desktop/PythonTests$ cd foo && rm aa && cd bar && rm b || echo "something is wrong"
rm: cannot remove 'aa': No such file or directory
something is wrong #mind the error in second command in the row
И, наконец, если все команды были выполнены успешно (код выхода 0), сценарий просто продолжается:
gv@debian:/home/gv/Desktop/PythonTests$ cd foo && rm a && cd bar && rm b || echo "something is wrong"
gv@debian:/home/gv/Desktop/PythonTests/foo/bar$
# mind that the error message is not printed since all commands were successful.
Важно помнить, что при использовании of && следующая команда выполняется, если предыдущая команда завершилась с кодом 0, что для bash означает успех.
Если какая-либо команда в цепочке идет не так, то за ней следует команда / сценарий / что угодно || будет выполнен.
И просто для записи: если вам нужно выполнить разные действия в зависимости от команды, которая сломалась, вы также можете сделать это с помощью классического сценария, отслеживая значение $?
, которое сообщает код выхода из точно предыдущая команда (возвращает ноль, если команда выполнена успешно, или другое положительное число, если команда не удалась)
Пример:
for comm in {"cd foo","rm a","cd bbar","rm b"};do #mind the error in third command
eval $comm
if [[ $? -ne 0 ]];then
echo "something is wrong in command $comm"
break
else
echo "command $comm executed succesful"
fi
done
Вывод:
command cd foo executed succesfull
command rm a executed succesfull
bash: cd: bbar: No such file or directory
something is wrong in command cd bbar
Совет: вы можете подавить сообщение «bash: cd: bbar: Нет такого файла. .. "путем применения eval $ comm 2> / dev / null
(возможно) более простой вариант принятого ответа:
set -e
, чтобы вызвать сбой одной команды для прерывания выполнения списка. if
- then
- else
для выполнения ваших команд обработки ошибок.
Этот последний кусок немного сложен.
Смотрите: set -e if cmd1 # e.g., cd foo cmd2 # e.g., rm a cmd3 # e.g., cd bar cmd4 # e.g., rm b then set +e commands to do upon success (if any) else set +e myfunc other commands to do upon failure (if any) fi
Сложность заключается в том, что вы помещаете свои команды
в if
часть из if
- затем
- else
,
не часть , затем
или часть else
.
Напомним, что синтаксис оператора if
равен
if list; then list; [ elif list; then list; ] ... [ else list; ] fi ↑↑↑↑
set -e
сообщает оболочке, что
if cmd1
(cd foo
) не выполняется,
он не должен продолжать выполнение cmd2
(rm a
),
и так далее по строке.
Если это произошло с командой на самом внешнем уровне сценария оболочки,
оболочка завершит работу.
Однако, поскольку cmd1
· cmd2
· cmd3
· cmd4
является (составным) списком, следующим за if
,
сбой любой из этих четырех команд
просто вызывает сбой всего списка -
, что вызывает выполнение предложения else
.
Если все четыре команды выполнены успешно, условие then
выполняется.
В любом случае первое, что вам следует сделать, это, вероятно, отключить {{1} } (отключите) параметр e
, выполнив set + e
.
В противном случае сценарий может вылететь из воды
, если команда в myfunc
не работает.