Существует ли способ иметь функцию в моем сценарии удара автоматическое выполнение на какой-либо ошибке команды?

Вся игра файловой системы изменилась значительно, от даже несколько лет назад. Практично говоря, большинство старые рекомендации стали не важными.

Необходимо будет проверить/выполнить более свежие сравнительные тесты, но предпочтительные варианты очень уменьшили.

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

BRTFS: В настоящее время работает хуже, чем EXT4, недостаточно проверки реального мира IMO.

ResierFS: EXT4 имеет B-дерево по умолчанию, он может оптимально индексировать много маленьких файлов.

Reiser4: Удаленный из официального Ядра, хотя действительно имеет востребованные функции. Будущее все еще сомнительно, больше сравнительных тестов/использования должен быть завершен.

XFS: EXT4 теперь имеет степени и динамический inodes, usally соответствует или превышает производительность XFS. Не говоря уже о, EXT4 имеет начальника, восстанавливаются/журналируют. Можно было утверждать, что это - промывка, но затем я все еще пошел бы EXT4, я только хочу измениться от значения по умолчанию, когда у меня есть неопровержимый довод.

JFS упоминания релевантен, если Ваш по сравнению с EXT3, сегодня он действительно не имеет шансы на выигрыш. Я знаю, что сделаю фанатов абсолютно гаек, но это - просто мое мнение. Я скажу, что работаю Системным администратором Linux, и это должно объяснить мое заключение.

11
27.04.2016, 21:24
3 ответа

Вы можете использовать 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 зарезервированные слова, часть команды, выполняемой в && или || , или , или если команда возвратный статус Быть перевернутым с использованием ! .

12
27.01.2020, 19:58

Взять ваше слово « каждая команда зависит от каждой предыдущей команды. Если какая-либо команда не удалась, весь скрипт должен потерпеть неудачу » буквально, я думаю, вам не нужна какая-либо специальная функция для обработки ошибок.

Все, что вам нужно, это связать ваши команды с помощью оператора && и оператора || , который выполняет именно то, что вы написали.

Например, эта цепочка разорвется и напечатает «что-то пошло не так», если любая из предыдущих команд сломалась (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

0
27.01.2020, 19:58

(возможно) более простой вариант принятого ответа:

  1. Используйте set -e , чтобы вызвать сбой одной команды для прерывания выполнения списка.
  2. Просто перечислите свои команды.
  3. Используйте оператор 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 не работает.

set -e определен и описан в спецификации POSIX .

1
27.01.2020, 19:58

Теги

Похожие вопросы