как обнаружить, если команда выполняется отказавший в оболочке?

Другое решение с вырезанным и вставленным (это зависит от того, чтобы там быть существующим text файл):

cut -d"-" -f 6-7 text | paste - text

После редактирования это работало бы:

grep -Po '[0-9]{1,2}-[[:alpha:]]*' text | paste - text
3
06.11.2014, 07:28
2 ответа

Вы можете использовать Set --e внутри скрипта, или пройдите -E к интерпретару при запуске.

#!/bin/sh
set -e

ИЛИ

/bin/sh -e /path/to/script.sh

http://pubs.opengroup.org/onlinepubs/007904975/Uttilities/set.html :

-E

Когда эта опция включена, если простой Команда терпит неудачу по какой-либо из причин, перечисленных в последствиях ошибок оболочки или возвращает выход Значение состояния> 0, а не является частью списка составляющего после в то время как, пока, или если его ключевое слово, а не является частью AN и или или или или или из списка, И не является трубопроводом, предшественником! Зарезервированное слово, затем оболочка должен немедленно выйти.

4
27.01.2020, 21:16

Действительно, существует расовое состояние (такое, которое не причинило бы вреда).

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

Но в целом эта структура - очень плохая идея. * расширяется до отсортированного списка. AFAIK деактивировать это невозможно. Очевидно, что сортировка сама по себе - кошмар с 400K файлами. См. man bash , раздел «Расширение пути»:

После разделения слов, если не установлен параметр -f, bash сканирует каждое слово для символов *,? и [. Если появляется один из этих символов, то слово рассматривается как образец и заменяется отсортированным по алфавиту списком имен файлов, соответствующих образцу.

Кроме того, не следует запускать по одному экземпляру mv для каждого файла, поскольку можно перемещать сразу несколько файлов.

Это лучшее решение (в мире GNU):

find . -mindepth 1 -maxdepth 1 -exec mv --target-directory=DIRECTORY {} +
-121--70029-

Проблема заключается в том, что прямой вызов делает имя сценария именем команды, см.

cat /proc/$PID/comm

Это приводит к совпадению pgrep . Если вызывается через bash , то имя команды - «bash».

Вместо этого используйте

pgrep --exact zeal

.

-121--63220-

Также можно использовать ловушку.

trap 'command' signal

Сценарий оболочки может выглядеть следующим образом:

trap 'trapHandler $LINENO' ERR

для захвата сигнала ERR. trapHandler () может быть таким.

trapHandler()
{
    retCode=$?
    echo "[LINE:$1] Error:exited with status $retCode"
    exit $retCode
}
1
27.01.2020, 21:16

Теги

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