BASH-скрипт: Попытка получить 3 кода возврата/статуса выхода, чтобы дать мне «глобальный выход»

Вы можете запускать тесты, которые не встроены -в findс помощью -execили -execdir, и использовать их результаты в качестве теста find. В этом случае:

find. -name \*.ext3 -execdir /usr/bin/test -e file1.ext1 -a -e file2.ext2 \; -printf "%p\n" | sort -u | wc -l

Это будет искать файлы, соответствующие *.ext3, и для каждого из них запускать /usr/bin/testв содержащем каталоге, чтобы проверить, существуют ли там file1.ext1и file2.ext2. Если это так, он выводит путь к содержащемуся каталогу. Затем вывод фильтруется для удаления дубликатов и, наконец, подсчитывается.

0
17.04.2020, 14:52
3 ответа

Одной из возможностей одновременной проверки нескольких кодов возврата для 0, 1 и всех остальных является объединение кодов возврата:

echo "$USER $(date +%F)" |& tee info.log
exit_code=$((exit_code | PIPESTATUS[0]))
echo "$USER $(date +%F)" |& tee list.log
exit_code=$((exit_code | PIPESTATUS[0]))
echo "$USER $(date +%F)" |& tee check.log
exit_code=$((exit_code | PIPESTATUS[0]))

if (( 0 == exit_code )); then
  echo ">> SUCCESS <<"
elif (( 1 == exit_code )); then
  echo ">> WARNING <<"
else
  echo ">> FAILED <<"
fi

При таком подходе вы не можете различать коды выхода, и потенциально может возникнуть несколько кодов возврата, но для общего кода возврата OK / Not OK этого должно быть достаточно.

1
19.03.2021, 02:28

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

global_exit=$((( info_exit > list_exit > check_exit ? info_exit : list_exit > check_exit )))

к этому:

global_exit=$((( info_exit > list_exit > check_exit ? info_exit : list_exit > check_exit ? list_exit : check_exit )))

Как у вас, если информация _exit самая большая, все работает нормально. Если нет, он устанавливает глобальный выход _на 0 или 1 в зависимости от того, является ли выход списка _> проверить выход _или нет. При добавлении дополнительного условия будет установлено большее значение из списка _выхода или проверки _выхода.

1
19.03.2021, 02:28

Вы можете использовать функцию и проверить все коды состояния PIPESTATUSи сохранить наибольшее значение.

#!/bin/bash

max_exit=0

set_max_exit() {
  for i in "${PIPESTATUS[@]}"; do
    [ "$i" -gt "$max_exit" ] && max_exit=$i
  done
}

echo | grep x   # exit 1
set_max_exit

ech             # exit 127
set_max_exit

ls adfds        # exit 2
set_max_exit

if [ "$max_exit" -eq 0 ]; then
  echo ">> SUCCESS <<"
elif [ "$max_exit" -eq 1 ]; then
  echo ">> WARNING <<" >&2
else
  echo ">> FAILED <<" >&2
fi

exit "$max_exit"

Выход:

$./script.sh
./script.sh: line 14: ech: command not found
ls: cannot access 'adfds': No such file or directory
>> FAILED <<
$ echo $?
127
1
19.03.2021, 02:28

Теги

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