Все хорошие предложения, приведенные выше, особенно set -e
, которые были бы хорошим базовым решением для вашего возражения № 1.
Другой подход к отлову ошибок подпроцесса оболочки заключается в том, чтобы использовать оператор if, т.е.
if true ; then
printf "success\n"
else
printf "failure\n"
fi
будет самой базовой иллюстрацией этой идеи.
Редактировать
Вот более сложный пример, модифицированный из другой публикации здесьна SO
if ls /path/to/files* /dev/null 2>&1 ; then
echo "files do exist"
else
echo "files do not exist"
fi
Наконец, возможно встроить полные команды конвейера с синтаксисом if cmd ; then
, но последний вызов в конвейере - это то, что возвращает истину или ложность всего конвейера.
конец редактирования
К сожалению, некоторые утилиты Unix не подходят (для этой цели) с их кодами возврата, но это очень зависит от платформы (может быть, ядумаю о Sun4 sed, и определенно много ftp клиентов).Возможно, в хорошем дистрибутиве Linux такой проблемы нет, но вам нужно проверять (и, возможно, документировать) каждую утилиту, когда вы начинаете ее использовать.
Для возражения № 2, разбора аргументов, я могу предложить полный шаг в этом вопросе, с отрицательным кодом, который поначалу может быть сложно понять другим.
Вместо того, чтобы полагатьсяЦикл while с getargs и инструкциями case для обработки аргументов: посмотрите, поможет ли вам добавление переменных окружения к вызову подпроцесса, т. е.
код с флагами
cat myProgram.sh
#! /bin/bash
set -e
if ${testingMode:-false} ; then
printf "${0##*/}:TestingMode:Starting:args=${@}"
fi
# more code
Теперь, а неимея встроенную внутреннюю обработку для обработки testMode, вы предварительно ожидаете переменную в командной строке скрипта и временно «включаете» ее, т. е. ::
testingMode=true ./myProgram.sh otherargs that makes sense as args
вы можете иметь столько префиксированных переменныхв начале команды, как вам нравится, поэтому возможно создать сценарий, который не имеет никакой обработки аргументов.Иногда это имеет смысл, а иногда нет.(Между прочим, я получил эту технику, прочитав «Среду программирования Unix» Кернигана и Пайка)
Опять же, если вам придется беспокоиться о передаче этого кода при переходе на другую работу в той же организации, вы можетедолжны иметь учебный класс по использованию этих малоиспользуемых особенностей оболочки.
Ваше последнее возражение «трудно отладить» защищать труднее, особенно ошибки, связанные с несовпадающими {}, (), "и". Существует множество отладчиков ksh, которые работают по принципу ранних версий.Отладчики языка c, dbx и gdbx.
Удачи. Сообщите нам, когда найдете язык программирования, который может «делать то, что я имею в виду»: -) !!
Я надеюсьэто помогает.