Вы используете e2fsck так что я предполагаю, что мы говорим о ext? файловая система. Команда
tune2fs -l /dev/sdXX
скажет вам очевидное состояние файловой системы (которая может быть смонтирована, это безопасно). Вы получите (среди прочего) либо
Filesystem state: clean
или что-то еще, кроме clean . Поскольку grep возвращает false, если совпадение не найдено, ваша основная попытка может быть такой:
tune2fs -l /dev/sdXX | grep "^Filesystem state:[ ]*clean$" || { commands; to; fix; the; filesystem; }
Вышеуказанное будет работать, только если файловая система заранее обнаружит свое нечистое состояние. Иногда вы все равно хотите проверить наличие проблем (вот почему желаемое поведение - fsck каждого N-го монтирования или по прошествии такого-то количества дней). Если я вас правильно понял, вы пытаетесь узнать, следует ли вам e2fsck -y /dev/sdXX , анализируя вывод e2fsck -n /dev/sdXX .
Я говорю не анализировать вывод. Проверьте статус выхода. Смотрите man 8 e2fsck чтобы узнать:
Код выхода, возвращаемый e2fsck является суммой следующих условий:
0 - нет ошибок
1 - исправлены ошибки файловой системы
2 - Исправлены ошибки файловой системы, система должна быть перезагружена
4 - Ошибки файловой системы оставлены без исправлений
8 - Операционная ошибка
16 - ошибка использования или синтаксиса
32 - e2fsck отменен по запросу пользователя
128 - ошибка общей библиотеки
Обратите внимание, что e2fsck -n /dev/sdXX будет ничего полезного (и вернет "без ошибок"), если файловая система кажется чистой; так что это еще один способ обнаружить текущее видимое состояние, как мы это сделали с tune2fs . В любом случае, вам нужна опция -f . Затем вы хотите знать, если статус выхода включает 4 . В bash это можно сделать с помощью:
e2fsck -nf /dev/sdXX # this is safe even if the filesystem is mounted
status=$?
[ $(( $status & 4 )) -eq 4 ] && { commands; to; fix; the; filesystem; }
Быстрое объяснение:
$? это состояние выхода последней команды (в данном случае e2fsck ). Я сохраняю его в отдельной переменной, чтобы можно было выполнить несколько тестов с ним. Это не обязательно в этом простом примере, где есть только один тест, но в целом это хорошая практика. Основная причина: после этих строк $status прежнему содержит состояние выхода e2fsck и может использоваться повторно, в то время как (новая) $? не имеет ничего общего с e2fsck .
$(( ... )) делает арифметику оболочки
- где
& - побитовое И,
- затем
[ ... -eq 4 ] фактически является test командой для проверки, равен ли результат 4 .
- Если проверка прошла успешно, будет выполнен блок
{ ... } .
Возможны ошибки не в самой файловой системе, а на более глубоком уровне устройства. Я думаю, что это выходит за рамки этого вопроса, но просто чтобы указать вам правильное направление, если вам это нужно, это полезные команды (обратите внимание на sdX , а не sdXX):
smartctl -t long /dev/sdX
badblocks -n -b 512 /dev/sdX
Прочитайте их справочные страницы, прежде чем использовать их.