Перейти к содержимому

Коды выхода

Code Meaning
0 Everything went fine.
1 Something went wrong and hostsctl has no more specific code for it.
2 The command line itself was wrong; emitted by clap, never by hostsctl.
3 The config is missing, unreadable, invalid, or holds errors that check reports.
4 The target file or the backup directory is not writable — retry under sudo.
5 Reading or writing a file failed for a reason other than permissions.
6 A remote blocklist could not be downloaded.

В автоматизации важно отличать 3 от 4: сломанный конфиг требует человека, нехватка прав — sudo. И check, и apply возвращают 3, когда в конфиге есть ошибки, так что одна ветка покрывает и прогон линтера, и настоящую запись.

#!/usr/bin/env bash
set -uo pipefail
hostsctl check
case $? in
0) ;;
3) echo "конфиг сломан, повторять бессмысленно" >&2; exit 1 ;;
*) echo "неожиданный отказ" >&2; exit 1 ;;
esac
sudo hostsctl apply -y

Если найдены только предупреждения, check выходит с 0: предупреждение стоит прочитать, но останавливать из-за него пайплайн незачем.

Ошибки идут в stderr, обычный вывод в stdout, поэтому hostsctl list | head работает как ожидается — включая поведение при SIGPIPE, которое Rust по умолчанию подавляет, а hostsctl возвращает как у обычной unix-утилиты.