Вы можете запускать тесты, которые не встроены -в 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, 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 этого должно быть достаточно.
Если у меня правильное намерение, и вы хотите продолжить работу с кодом, как написано, измените это:
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 в зависимости от того, является ли выход списка _> проверить выход _или нет. При добавлении дополнительного условия будет установлено большее значение из списка _выхода или проверки _выхода.
Вы можете использовать функцию и проверить все коды состояния 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