Bash — выполнить две команды и получить статус выхода 1, если первая не удалась

Это немного сложно сделать с sed. Однако вот закомментированное предложение, которое работает с GNU sed:

parse.sed

s|([^ ]+).*/([^/]+)/.*|  "\2" : \1,|   # Extract size and name in json-format
1h; 1!H                                 # Correctly add them to hold-space
$ {
  z                                     # Clear pattern-space
  s/^/\{/                               # Prepend start-curly-brace
  G                                     # Fetch formatted json from hold-space
  s/,$//                                # Remove last comma
  s/$/\n\}/                             # Append end-curly-brace
  p                                     # Print
}

Запустите это так:

du -shm /var/vmail/mailboxes/domain/*/mail | sed -Enf parse.sed

Или в виде одного -вкладыша:

du -shm /var/vmail/mailboxes/domain/*/mail |
sed -Ene 's|([^ ]+).*/([^/]+)/.*|  "\2" : \1,|;1h;1!H;${z;s/^/\{/;G;s/,$//;s/$/\n\}/;p}'

Выход в обоих случаях:

{
  "USER1" : 80,
  "USER2" : 150,
  "USER3" : 220
}
4
17.05.2019, 23:23
4 ответа

Что такое сценарий оболочки, кроме файла, содержащего команды оболочки? Вы можете притвориться, что это не сценарий оболочки и поместить его в одну строку с чем-то вроде:

(test; r=$?; report; [ "$r" -gt 0 ] && exit 1; exit 0)

Это завершает подоболочку с 1, если первая команда вернула что-либо, кроме 0; в противном случае возвращается 0.

Для примера --Я просто повторяю что-то вместо запуска реальной программы:

$ (false; r=$?; echo report; [ "$r" -gt 0 ] && exit 1; exit 0)
report
$ echo $?
1
$ (true; r=$?; echo report; [ "$r" -gt 0 ] && exit 1; exit 0)
report
$ echo $?
0
$ # example with an exit-status of 2:
$ (grep foo bar; r=$?; echo report; [ "$r" -gt 0 ] && exit 1; exit 0)
grep: bar: No such file or directory
report
$ echo $?
1

Если вы регулярно устанавливаете параметр оболочки errexit,вы хотите добавить переопределение, чтобы подоболочка не закрывалась преждевременно:

(set +o errexit; false; r=$?; echo report; [ "$r" -gt 0 ] && exit 1; exit 0)
9
27.01.2020, 20:44

Сохранение и повторное использование $?.

test; ret=$?; report; exit $ret

Если у вас есть несколько тестовых команд и вы хотите запустить их все, но следите за тем, не сработала ли одна из них, вы можете использовать ловушку ERR в bash.

failures=0
trap 'failures=$((failures+1))' ERR
test1
test2
if ((failures == 0)); then
  echo "Success"
else
  echo "$failures failures"
  exit 1
fi
18
27.01.2020, 20:44

Вы сказали "выйти из состояния 1, если команда testне удалась". Предполагая, что вы намеревались сделать это различие (, то есть вы хотите, чтобы значение выхода было 1, даже если команда testзавершается, скажем, 2 или 3 или что-то еще ), тогда это достойное решение:

test && { report; true; } || { report; false; }

Если вы на самом деле не имели в виду «1», но все, что не -ноль, с которым testзавершилось, было бы в порядке в качестве вашего общего кода выхода, тогда текущий верхний ответ (сохранить и повторно использовать $? )работает нормально.

4
27.01.2020, 20:44

Очень плохая идея, но, похоже, она работает, для вдохновения:

(trap report exit; test)
0
27.01.2020, 20:44

Теги

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